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

Langage C++ Discussion :

C++ - Remplir une liste de structures


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Juillet 2014
    Messages : 41
    Par défaut C++ - Remplir une liste de structures
    Bonjour,
    J'ai ouvert une nouvelle discussion car, après beaucoup de recherches, je ne trouve aucune discussion/forum qui répondent à ma question.

    - J'ai une structure de la forme suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    typedef struct 
    {
         int idPipe;
         list<pair<int,int>> elemNodeList;
    } PipeElemNode;
    - Je souhaite créer une liste de ce type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    list<PipeElemNode> pipeElemNodeList;
    - Je possède un tuple de la forme : <idPipe, element, node>.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    vector<tuple<int,int,int>> myVector =  myPipingModel.GetTupleElemNode();
    myVector est donc mon tuple.

    - Mes tuples sont de la forme : <1, 1, 1> <1, 1, 2> <2, 1, 2> ...
    Je peux donc avoir plusieurs paires d'élement-Node pour un pipe donné. Dans mon exemple, pour le pipe 1, j'ai la paire <1, 1> et <1,2> d'où mon choix de structure.

    - Mon problème : Je n'arrive pas à remplir ma liste pipeElemNodeList. J'arrive à remplir une structure donnée mais pas pour une liste de structure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    PipeElemNode test;
    test.idPipe = get<0>(myVector[0]); // Remplissage du premier paramètre de ma structure
    test.elemNodeList.push_back(make_pair(get<1>(myVector[0]), get<2>(myVector[0]))); // Remplissage de la liste de paire de ma structure
    for (list<pair<int,int>>::iterator i = test.elemNodeList.begin(); i != test.elemNodeList.end(); i++ ) 
    {
        cout << (*i).first << " and " << (*i).second << endl; // affichage pour les tests
        cout << endl << "press any key to continue...";
        getchar();
    }
    Je souhaiterai faire un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pipeElemNodeList.push_back(PipeElemNode(Les paramètres de mon struct))
    mais je sais que cette syntaxe n'existe pas. Le tout bien sûr dans une boucle FOR mais la boucle je pense savoir où la mettre.
    Je ne sais donc pas remplir une liste de structure avec une liste de paire à l'intérieur de cette structure. Je sais que c'est un peu tordu.

    Je ne sais pas si j'ai été claire dans mes explications.

    Je vous remercie d'avance pour votre aide

  2. #2
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 292
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 292
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    si j'ai bien compris, la solution est fort simple: puisque tu as déjà construit et rempli ta structure (variable test), il te suffit de l'ajouter dans ta liste.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pipeElemNodeList.push_back(test);

  3. #3
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Juillet 2014
    Messages : 41
    Par défaut
    Merci de ta réponse rapide et efficace. Je ne savais pas qu'une telle syntaxe était possible ! En effet, ça compile avec ta solution. Mais aurais-tu un moyen de parcourir cette liste pour que je puisse vérifier qu'elle est bien remplie ?

    Je sais qu'il faut utiliser un itérateur pour parcourir une liste :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for (list<PipeElemNode>::iterator i = pipeElemNodeList.begin(); i != pipeElemNodeList.end(); i++ ) 
    {
        cout << *i << endl; // Cela ne marchera pas bien sûr
    }
    Est ce que ça peut être un truc du type (dans la boucle FOR) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cout << (*i).first << " and " << (*i).second << endl; // Pour l'affichage de la pair ?
    Je pense que ça ne marche pas.. Mais je ne vois vraiment pas comment visualiser cette liste de type PipeElemNode qui contient une liste de paire.
    Je sais comment afficher la liste de paire mais je ne sais pas l'intégrer dans ma liste globale pipeElemNodeList.

    Merci d'avance de ta réponse

  4. #4
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 292
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 292
    Billets dans le blog
    2
    Par défaut
    Effectivement, pour parcourir un conteneur (vector, list, set, map, ...) on utilise un itérateur.

    Ici, comme tu l'as écrit, ton itérateur est de type list<PipeElemNode>::iterator. Pour simplifier les choses, tu peux considérer qu'un itérateur c'est comme un pointeur. Ce n'est pas exactement ça, mais dans un premier temps, juste pour aider à la compréhension, on va dire que c'est la même chose.

    Donc, on peut voir l'itérateur i, de type list<PipeElemNode>::iterator, comme un pointeur qui va parcourir ta liste. Lorsque tu fais i=pipeElemNodeList.begin(), il faut imaginer que i pointe sur le premier élément de la liste pipeElemNodeList. Lorsque tu fais i++, il va pointer sur l'élément suivant, jusqu'à ce qu'il arrive sur pipeElemNodeList.end(), qui n'est pas le dernier élément de la liste, mais un objet un peu particulier qui signifie qu'on a dépassé le dernier élément.

    L'analogie avec le pointeur se poursuit dans la syntaxe: de la même façon qu'un pointeur, pour accéder au contenu d'un itérateur il faut utiliser l'opérateur d'accès au membre (member access operateur), ou opérateur de déréférencement, *i, comme tu l'as écrit.

    Jusqu'ici, ton code est ok. Ton erreur est dans le fait que tu n'as pas bien compris ce qu'il y a dans i (dit autrement: sur quel type d'objet pointe i), et donc ce que tu obtiens lorsque tu déréférence i. Regardes bien: i est de type list<PipeElemNode>::iterator, ce que l'on peut écrire sous la forme: i pointe sur un élément de type PipeElemNode. Donc quand tu fais *i, tu obtiens un PipeElemNode. Donc tu peux faire (*i).idPipes ou (*i).elemNodeList. Si c'est la liste des nodes qui t'intéresse (elemNodeList), alors il te faudra un nouvel itérateur pour parcourir cette liste. Tu vas donc certainement devoir faire une nouvelle boucle, qui sera imbriquée dans la première. Je ne rentre pas plus dans le détail pour te laisser chercher.

    A noter que tu peux remplacer (*i).unTruc par i->unTruc, les deux syntaxes sont strictement équivalentes (l'asm généré est exactement le même).

  5. #5
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Juillet 2014
    Messages : 41
    Par défaut
    Je te remercie pour ton explication hyper claire !!
    L'affichage se fait donc comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    for (list<PipeElemNode>::iterator i = pipeElemNodeList.begin(); i != pipeElemNodeList.end(); i++) 
    {
        cout << "id Pipe : " << (*i).idPipe << endl;
        for (list<pair<int,int>>::iterator k = (*i).elemNodeList.begin(); k != (*i).elemNodeList.end(); k++) 
        {
    	cout << "element : " << (*k).first << " and node : " << (*k).second << endl;
        }
     
    }
    Je rencontre mon dernier problème.
    Comme je l'avais expliquer dans mon premier post pour un pipe associé j'ai une liste de pair<elem, node>

    Voici comment je rempli ma structure actuellement :
    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
    list<PipeElemNode> pipeElemNodeList; // Création de la liste de type PipeElemNode
    vector<tuple<int,int,int>> myVector =  myPipingModel.GetTupleElemNode(); // On récupère le tableau de tuple <idPipe, elem, node>
     
    for (int u = 0; u<myVector.size(); u++)
    {
    	PipeElemNode test; // Je créé une instance de ma structure
    	test.idPipe = get<0>(myVector[u]);
    	if ((u == 0) || (get<0>myVector[u-1] != get<0>myVector[u]))
    	{
    	    test.elemNodeList.push_back(make_pair(get<1>(myVector[u]), get<2>(myVector[u])));
    	}
     
    	if ((u != 0) && (get<0>myVector[u-1] == get<0>myVector[u]))
    	{
    	    test.elemNodeList.push_back(make_pair(get<1>(myVector[u]), get<2>(myVector[u]))); // Ligne qui me pose problème
    	}
     
    	pipeElemNodeList.push_back(test); // Remplissage de la liste 
    }
    Pour la ligne qui me pose problème : en réalité je souhaite que si je ne suis pas au début de myVector[] et que mon numéro de pipe est identique au précédent alors je veux remplir la liste de pair<elem, node> du bon pipe !!

    Parce que pour l'instant, lorsque j'affiche pas à pas ma liste, j'ai la suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Pour le pipe : 1
    element : 1 and node : 1
     
    Pour le pipe : 1
    element : 1 and node : 2
    Alors que je souhaite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Pour le pipe : 1
    element : 1 and node : 1
    element : 1 and node : 2
    C'est à dire regrouper les pairs pour chaque pipe. Je ne vois pas où je peux remplir ma liste de pair<elem, node>.

    Merci d'avance pour ta réponse

  6. #6
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 292
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 292
    Billets dans le blog
    2
    Par défaut
    La philosophie de ce forum consiste à ne pas faire le travail à la place des gens qui posent des questions, donc je ne vais pas te donner de réponses toutes faites, je vais juste te montrer et t'expliquer tes erreurs.

    Commençons par le bout de code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for (int u = 0; u<myVector.size(); u++)
    {
    	PipeElemNode test; // Je créé une instance de ma structure
    Lorsque tu créés une instance de PipeElemNode, étant donnée tu ne passes pas par un pointeur (ce qui est bel et bon: les pointeurs c'est le mal), cette instance est allouée sur la pile (elle serait allouée sur le tas si c’eût été un pointeur). La pile, comme son nom l'indique, fonctionne comme une pile: LIFO (Last In First Out: le dernier entré est le premier sorti). Les libérations de la pile (dépilages) sont gérées par la notion de portée (scope en anglais): un objet est alloué (empilé) à un moment donné, et il sera supprimé (dépilé) lorsque l'exécution sortira de sa portée. En gros (ce n'est pas tout à fait exact, mais ça suffira pour les considérations présentes) ce qui définit la portée d'un objet alloué sur la pile ce sont les accolades: { et }. Le code suivant illustre comment C++ gère la pile:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    {
       MyObject o1;
       {
          MyObject o2;
          o1.DoSomething(); // ok
          o2.DoSomething(); // ok
       }
       o1.DoSomething(); // ok
       o2.DoSomething(); // pas ok
    }
    o1.DoSomething(); // pas ok
    o2.DoSomething(); // pas ok
    La première accolade fermante déclenche la destruction (dépilage) de o2, donc le 2eme appel à o2.DoSomething() ne peut pas fonctionner puisqu'à ce moment-là, o2 n'existe plus. Idem avec o1 pour l'accolade suivante.

    C'est ce qui se passe dans ton code. Le corps de ta boucle for est entouré d'accolade, ce qui signifie que tout ce qui est alloué dans le corps de la boucle for est désalloué à la fin de chaque itération. Ta variable test n'est donc jamais la même d'une itération à l'autre: à chaque itération, il en créé une nouvelle qu'il détruit lorsqu'il arrive à l'accolade fermante correspondant à la fin du corps de la boucle for.

    Ensuite, il y a quelque chose qui doit te sauter aux yeux: tu as deux tests qui déterminent si on doit créer une nouvelle liste de pipe ou si on doit ajouter un nouveau pipe à une liste existante. Ce sont deux actions différentes. Or, ton code est le même dans les deux cas, cela ne peut pas être:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    test.elemNodeList.push_back(make_pair(get<1>(myVector[u]), get<2>(myVector[u])));
    Pour finir, le cas qui te pose problème c'est le cas où il faut ajouter un pipe à une liste qui existe déjà. Il faut donc que tu parviennes d'abord à récupérer la liste à laquelle il faut ajouter le nouveau pipe, puis ensuite faire le push_back. Il y a plein de façons de faire ça, je te laisse chercher

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Récupération d'une liste de structures Oracle via Java
    Par MagikMarcel dans le forum Langage
    Réponses: 2
    Dernier message: 29/06/2006, 16h34
  2. [débutant] Remplir une liste déroulante
    Par Floch dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 12/05/2006, 13h39
  3. Réponses: 7
    Dernier message: 18/04/2006, 17h44
  4. remplir une liste à partir d'une liste
    Par LeXo dans le forum Access
    Réponses: 7
    Dernier message: 14/04/2006, 12h29
  5. Remplir une Liste par SQL ?
    Par Zigouigoui dans le forum Requêtes et SQL.
    Réponses: 9
    Dernier message: 03/12/2005, 17h08

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