IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

[variable dans nom de contrôle]


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 46
    Points : 44
    Points
    44
    Par défaut [variable dans nom de contrôle]
    Bonjour,

    j'utilise Borland C++ Builder v6.

    J'imagine que ce que je recherche n'est pas possible, mais sait-on jamais ?

    Voilà : je dispose de plusieurs TImage (24 au total), dont leur nom est "Image" + un numéro de 1 à 24.
    En fonction de la position d'une valeur dans un tableau d'entiers,
    j'aimerais accéder aux propriétés des TImages par du code du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for (int i=0;i<23;i++)
    {
    if (tableau[i]==1)
    {
    "Image"+i->Picture->LoadFromFile("nimportekoi.bmp");
    }
    }
    Naturellement, cela ne marche pas.

    Pensez-vous qu'il existe une solution ?

    Par avance, merci.
    Nuclear.

  2. #2
    Membre chevronné Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Points : 2 160
    Points
    2 160
    Par défaut
    Bonjour

    Il faut que tu fasses un tableau d'images (et que tu lises/prennes des cours de C++)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    #include <vector>
     
    // ...
     
    std::vector<image> tab_image(24);
     
    for (std::size_t i = 0; i < tab_image.size(); ++i)
    {
        tab_image[i].loadFromFile("nom_image.bmp");
    }
    http://www.cplusplus.com/reference/vector/vector/
    http://cpp.developpez.com/faq/cpp/?p...#STL_container

    Edit: typo

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 46
    Points : 44
    Points
    44
    Par défaut
    Citation Envoyé par Ehonn Voir le message
    Bonjour

    Il faut que tu fasses un tableau d'images (et que tu lises/prennes des cours de C++)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    #include <vector>
     
    // ...
     
    std::vector<image> tab_image(24);
     
    for (std::size_t i = 0 ; i < tab_image.size(); ++i)
    {
        tab_image[i].loadFromFile("nom_image.bmp");
    }
    http://www.cplusplus.com/reference/vector/vector/
    http://cpp.developpez.com/faq/cpp/?p...#STL_container
    Merci...
    Seulement je n'ai pas compris le <image> après std::vector.
    D'ailleurs ce code ne semble pas fonctionner.

    Ce qui risque de me poser problème ensuite, c'est comment afficher le contenu du tableau dans ma form ?

  4. #4
    Membre chevronné Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Points : 2 160
    Points
    2 160
    Par défaut
    std::vector est un containeur générique, il peut stocker des int, des float, des double et probablement des image. Il faut lui indiquer le type entre chevrons (<type>).

    Voici un exemple de code qui créé des images et qui les utilises. Il faut bien comprendre que std::vector est un conteneur. Donc tu as accès directement à ton image (tab_image[i] est une image).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    // g++ -Wall -Wextra -pedantic vector_image.cpp -o vector_image && ./vector_image
     
    #include <iostream>
    #include <vector>
    #include <string>
     
    // Voici une classe image (à remplacer par ton vrai type image)
    class image
    {
    public:
     
    	void load_from_file(std::string const & filename)
    	{
    		std::cout << "Chargement du fichier " << filename << std::endl;
    	}
    };
     
    // Voici une fonction qui utilise une image
    void display_image(image const & img)
    {
    	std::cout << "Affichage d'une image" << std::endl;
    }
     
    int main()
    {
    	// On créé un tableau de 6 images
    	std::vector<image> tab_image(6);
     
    	// Chargement des images
    	for (std::size_t i = 0; i < tab_image.size(); ++i)
    	{
    		tab_image[i].load_from_file("nom_image.bmp");
    	}
    	std::cout << std::endl;
     
    	// Utilisation des images
    	for (std::size_t i = 0 ; i < tab_image.size(); ++i)
    	{
    		display_image(tab_image[i]);
    	}
    	std::cout << std::endl;
     
    	return 0;
    }
    Et voilà la sortie (chargement et utilisation de 6 images) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Chargement du fichier nom_image.bmp
    Chargement du fichier nom_image.bmp
    Chargement du fichier nom_image.bmp
    Chargement du fichier nom_image.bmp
    Chargement du fichier nom_image.bmp
    Chargement du fichier nom_image.bmp
     
    Affichage d'une image
    Affichage d'une image
    Affichage d'une image
    Affichage d'une image
    Affichage d'une image
    Affichage d'une image

  5. #5
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    En C++, on utilisera surtout des iterateur pour parcourir des conteneurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    std::vector<image> tab_image(6);
     
            std::vector<image>::iterator it = tab_image.begin();
            std::vector<image>::const_iterator const end = tab_image.end();
     
    	// Chargement des images
    	for (; it != end ; ++it)
    	{
    		it->load_from_file("nom_image.bmp");
    	}
    En C++11, on pourra même utiliser ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    std::vector<image> tab_image(6);
     
            for( image & mon_image : tab_image )
                   mon_image.load_from_file("mon_image.bmp");

  6. #6
    Membre chevronné Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Points : 2 160
    Points
    2 160
    Par défaut
    Citation Envoyé par Neckara Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    std::vector<image> tab_image(6);
     
            std::vector<image>::iterator it = tab_image.begin();
            std::vector<image>::const_iterator const end = tab_image.end();
     
    	// Chargement des images
    	for (; it != end ; ++it)
    	{
    		it->load_from_file("nom_image.bmp");
    	}
    En C++, on limite la portée des variables ! :O
    Donc, avant C++11 (on peux utiliser des typedef pour alléger l'écriture) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for (std::vector<image>::iterator img = tab_image.begin(); img != tab_image.end(); ++img)
    {
    	img->load_from_file("nom_image.bmp");
    	// ou
    	(*img).load_from_file("nom_image.bmp");
    }
    La syntaxe de C++11 avec le "range-based for loop" est sympatique
    J'ai hésité à en parler, mais j'ai préféré me "concentrer" sur le vector.

  7. #7
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Citation Envoyé par Ehonn Voir le message
    En C++, on limite la portée des variables ! :O
    Le but principal est de rester lisible, si on met tout dans le for, on perd en lisibilité.

    De plus,
    Citation Envoyé par Ehonn Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for (std::vector<image>::iterator img = tab_image.begin(); img != tab_image.end(); ++img)
    Tu va recalculer à chaque tour de boucle la fin de ton conteneur ( end() n'étant pas toujours en temps constant il me semble ).

  8. #8
    Membre chevronné Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Points : 2 160
    Points
    2 160
    Par défaut
    Citation Envoyé par Neckara Voir le message
    Le but principal est de rester lisible, si on met tout dans le for, on perd en lisibilité.
    Je ne suis pas d'accord Surtout si on utilise le typedef. Au pire on peut toujours prendre "ta solution" avec des extra accolades.

    Citation Envoyé par Neckara Voir le message
    Tu va recalculer à chaque tour de boucle la fin de ton conteneur ( end() n'étant pas toujours en temps constant il me semble ).
    http://www.cplusplus.com/reference/vector/vector/end/ «Complexity: Constant»
    Et même si ce n'était pas le cas : et alors ?
    A-t-on vraiment besoin d'une boucle super optimisée lorsqu'on charge des fichiers depuis le disque dur ?
    Et si le vecteur fait une réallocation (pas dans ce code, de façon générale), tes itérateurs seront invalides. Au mieux tu auras une boucle infinie ou une erreur de segmentation. Au pire, tu modifieras une/des variables qui t'appartiennent et qui n'ont rien à voir avec la choucroute.
    Bref, c'est trop dangereux pour être conseillé (et utilisé selon moi), surtout à un débutant.

    Bref, ça dérive alors qu'on est sûrement d'accord pour dire que le mieux est la version C++11

  9. #9
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Oui, le mieux est la version C++11

    Attention, tu sembles oublier le principe de base des conteneurs de la STL, celle de pouvoir remplacer un conteneur en modifiant un minimum de code.

    std::vector::end() est bien constant mais on est pas assuré que les end() des autres conteneurs soient constants.

    A-t-on vraiment besoin d'une boucle super optimisée lorsqu'on charge des fichiers depuis le disque dur ?
    Ce n'est pas une super-optimisation non plus et ça ne coûte rien, au contraire
    Et si le vecteur fait une réallocation (pas dans ce code, de façon générale), tes itérateurs seront invalides. Au mieux tu auras une boucle infinie ou une erreur de segmentation. Au pire, tu modifieras une/des variables qui t'appartiennent et qui n'ont rien à voir avec la choucroute.
    Bref, c'est trop dangereux pour être conseillé (et utilisé selon moi), surtout à un débutant.
    Lors d'un parcours avec un for, il n'y a aucune raison qu'il y ai une réallocation. Un for doit être utilisé quand on sait d'avance le nombre de tours qui sera effectué.

    Si on veut faire des suppressions, ajouts, il faut utiliser un while.

  10. #10
    Membre chevronné Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Points : 2 160
    Points
    2 160
    Par défaut
    Oui et oui, mais ton it et ton end n'étaient pas limités à la boucle for (ce que je critique) (il peut être tendant de les réutiliser)
    Même problème : utilisation de size par un débutant.

Discussions similaires

  1. variable dans nom de fichier
    Par bernardhoso dans le forum z/OS
    Réponses: 6
    Dernier message: 07/05/2013, 11h15
  2. Variable dans nom de control
    Par Glherbier dans le forum VBA Access
    Réponses: 2
    Dernier message: 12/11/2010, 12h10
  3. [Batch] Variable dans nom de variable
    Par vincent magnin dans le forum Scripts/Batch
    Réponses: 3
    Dernier message: 17/09/2009, 13h13
  4. SSIS - Variable dans nom fichier destination
    Par edony44 dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 08/10/2007, 09h31
  5. Variable dans Nom d'une Textbox
    Par kristell dans le forum Windows Forms
    Réponses: 3
    Dernier message: 17/09/2007, 22h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo