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++

  1. #1
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 31
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Juillet 2014
    Messages : 41
    Points : 19
    Points
    19
    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é
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    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);
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

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

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

    Informations forums :
    Inscription : Juillet 2014
    Messages : 41
    Points : 19
    Points
    19
    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é
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    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).
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

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

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

    Informations forums :
    Inscription : Juillet 2014
    Messages : 41
    Points : 19
    Points
    19
    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é
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    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
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  7. #7
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 31
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Juillet 2014
    Messages : 41
    Points : 19
    Points
    19
    Par défaut
    Je te remercie pour ta réponse. Je préfère justement avoir des explications à la place d'une réponse toute faite. Je préfère comprendre pourquoi je me suis trompée, pour corriger mes erreurs seules. Je te remercie en tout cas pour ta patience.

    J'ai pu résoudre mon problème de la façon suivante : (ce n'est probablement pas la solution optimale mais ça marche )
    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
    for (int u = 0; u<myPipingModel.SizeIdPipeListWithoutDuplicate(); u++)
    {
    	PipeElemNode myPipeElemNode;
    	myPipeElemNode.idPipe = myPipingModel.GetPipeWithoutDuplicate(u);
     
    	for (int e = 0; e<myVector.size(); e++)
    	{
    		if(myPipeElemNode.idPipe == get<0>(myVector[e]))
    		{
    			myPipeElemNode.idPipe = get<0>(myVector[u]);
    			myPipeElemNode.elemNodeList.push_back(make_pair(get<1>(myVector[e]), get<2>(myVector[e])));
    		}
    	}
     
    	pipeElemNodeList.push_back(myPipeElemNode);
    }
    NOTE :


    Tes explications m'ont, en tout cas, été d'une très grande utilité dans la résolution de mon problème et je t'en remercie

  8. #8
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 31
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Juillet 2014
    Messages : 41
    Points : 19
    Points
    19
    Par défaut
    Une petite précision : la boucle principale FOR boucle désormais sur une liste de pipe (1,2,3,...) et plus sur les tuples (car un pipe pouvait apparaître plusieurs fois du coup !) ce qui rend les choses plus simple !

    Je marque le sujet résolu !

  9. #9
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 31
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Juillet 2014
    Messages : 41
    Points : 19
    Points
    19
    Par défaut
    Correction : le code qui marche est le suivant :

    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
    for (int u = 0; u<myPipingModel.SizeIdPipeListWithoutDuplicate(); u++)
    {
    	PipeElemNode test;
    	test.idPipe = myPipingModel.GetPipeWithoutDuplicate(u);
     
    	for (int e = 0; e<myVector.size(); e++)
    	{
    		if(test.idPipe == get<0>(myVector[e]))
    		{
    			test.elemNodeList.push_back(make_pair(get<1>(myVector[e]), get<2>(myVector[e])));
    		}
    	}
     
    	pipeElemNodeList.push_back(test);
    }
    Désolée, je me suis perdue dans mes versions !

  10. #10
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Félicitations. Content d'avoir pu t'aider.
    Par curiosité: il s'agit d'un exercice en rapport avec tes études?
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  11. #11
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 31
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Juillet 2014
    Messages : 41
    Points : 19
    Points
    19
    Par défaut
    Cette année, j'étais en 4ème en école d'ingénieur au département informatique. Je suis donc en stage en ce moment dans une boîte et plus particulièrement une section ou il n'y a que des ingénieurs en mécanique. Google est donc mon seul ami pour réaliser le projet dont je suis la seule developpeuse. Donc mes questions ont en effet un rapport avec mes études

  12. #12
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Ok alors si c'est un stage, et si ça t'intéresse et que tu souhaites t'améliorer en c++, je te propose de considérer le code suivant:
    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
    45
    46
    47
    48
    #include <iostream>
    #include <set>
    #include <vector>
    #include <map>
    #include <tuple>
     
    using namespace std;
     
    typedef map< int, set< pair<int,int> > > PipeNetwork;
    typedef vector< tuple<int, int, int> > InputNetwork;
     
    InputNetwork FillInputNetwork()
    {
    	InputNetwork input_network;
    	input_network.push_back(make_tuple(1, 2, 3));
    	input_network.push_back(make_tuple(1, 4, 5));
    	input_network.push_back(make_tuple(2, 5, 6));
    	input_network.push_back(make_tuple(3, 4, 5));
    	input_network.push_back(make_tuple(1, 8, 5));
    	input_network.push_back(make_tuple(2, 7, 5));
    	input_network.push_back(make_tuple(1, 8, 5)); // doublon
    	return input_network;
    }
     
    void PrintPipeNetwork(const PipeNetwork& pipes)
    {
    	for (auto p1 : pipes)
    	{
    		cout << "pipe " << p1.first << endl;
    		for (auto p2 : p1.second)
    			cout << "  " << p2.first << " - " << p2.second << endl;
    		cout << endl;
    	}
    }
     
    int main()
    {
    	InputNetwork input_network = FillInputNetwork();
     
    	PipeNetwork pipes;
    	for (auto t : input_network)
    		pipes[get<0>(t)].insert(make_pair(get<1>(t),get<2>(t)));
     
    	PrintPipeNetwork(pipes);
     
    	getchar();
    	return 0;
    }
    Copier, coller, compiler, exécuter.
    A priori, ça fait ce que tu veux. Je te propose ce bout de code pour te montrer à quel point le c++ peut être extrêmement simple. Si tu regardes bien, dans ce code, la transformation d'un vecteur de tuple en une liste de pipe identifiés se fait en une ligne! Se sont les structures de données choisies qui font que les contraintes sont automatiquement respectées. Par exemple le choix du set pour éviter les doublons.
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  13. #13
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 31
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Juillet 2014
    Messages : 41
    Points : 19
    Points
    19
    Par défaut
    Je te remercie pour ton code. Je l'ai essayé en copiant-collant ce code mais j'ai les erreurs suivantes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    error C2143: erreur de syntaxe*: absence de ',' avant ':' // Erreur au niveau de la ligne "for (auto p1 : pipes)"
    error C3531: 'p1'*: un symbole dont le type contient 'auto' doit avoir un initialiseur
    error C2143: erreur de syntaxe*: absence de ';' avant '{'
    error C2039: 'first'*: n'est pas membre de 'System::Int32'
    1>          c:\program files (x86)\reference assemblies\microsoft\framework\.netframework\v4.0\mscorlib.dll*: voir la déclaration de 'System::Int32'
    C2143: erreur de syntaxe*: absence de ',' avant ':'
    error C3531: 'p2'*: un symbole dont le type contient 'auto' doit avoir un initialiseur
    A priori il ne connait pas le mot clé "auto", je ne le connaissais pas non plus..
    Ton code est vraiment plus simple et efficace que le mien en effet !
    Je vais le regarder attentivement et en prendre de la graine

  14. #14
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Tu utilises visual studio 2012?
    Mon code fonctionne sous vs2013 (et certainement les versions récentes de gcc).

    Il faut donc que tu remplaces les
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for (auto p1 = pipes.begin(); p1 != pipes.end(); ++p1 )
    Le mot clé auto est ton meilleur ami: clic
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  15. #15
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 31
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Juillet 2014
    Messages : 41
    Points : 19
    Points
    19
    Par défaut
    J'utilise Visual C++ 2010...
    J'ai fait les modifications nécessaires :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void PrintPipeNetwork(const PipeNetwork& pipes)
    {
    	for (auto p1 = pipes.begin(); p1 != pipes.end(); ++p1 )	{
    		cout << "pipe " << p1.first << endl; // Ligne où il y a l'erreur
    		for (auto p2 : p1.second) // J'ai le même soucis que le premier FOR à cette ligne aussi
    			cout << "  " << p2.first << " - " << p2.second << endl;
    		cout << endl;
    	}
    }
    J'ai les erreurs suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    error C2039: 'first'*: n'est pas membre de 'std::_Tree_const_iterator<_Mytree>'
    with
    [
    _Mytree=std::_Tree_val<std::_Tmap_traits<int,std::set<std::pair<int,int>>,std::less<int>,std::allocator<std::pair<const int,std::set<std::pair<int,int>>>>,false>>
    ]
    error C2143: erreur de syntaxe*: absence de ',' avant ':'
    error C3531: 'p2'*: un symbole dont le type contient 'auto' doit avoir un initialiseur
    error C2143: erreur de syntaxe*: absence de ',' avant ':'

  16. #16
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Erf, visual 2010....
    Bon, voici le code pour vs2010:
    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
    45
    46
    47
    48
    #include <iostream>
    #include <set>
    #include <vector>
    #include <map>
    #include <tuple>
     
    using namespace std;
     
    typedef map< int, set< pair<int,int> > > PipeNetwork;
    typedef vector< tuple<int, int, int> > InputNetwork;
     
    InputNetwork FillInputNetwork()
    {
    	InputNetwork input_network;
    	input_network.push_back(make_tuple(1, 2, 3));
    	input_network.push_back(make_tuple(1, 4, 5));
    	input_network.push_back(make_tuple(2, 5, 6));
    	input_network.push_back(make_tuple(3, 4, 5));
    	input_network.push_back(make_tuple(1, 8, 5));
    	input_network.push_back(make_tuple(2, 7, 5));
    	input_network.push_back(make_tuple(1, 8, 5)); // doublon
    	return input_network;
    }
     
    void PrintPipeNetwork(const PipeNetwork& pipes)
    {
    	for (auto p1 = pipes.begin(); p1 != pipes.end(); ++p1 )
    	{
    		cout << "pipe " << p1->first << endl;
    		for (auto p2 = p1->second.begin(); p2 != p1->second.end(); ++p2 )
    			cout << "  " << p2->first << " - " << p2->second << endl;
    		cout << endl;
    	}
    }
     
    int main()
    {
    	InputNetwork input_network = FillInputNetwork();
     
    	PipeNetwork pipes;
    	for (auto t = input_network.begin(); t != input_network.end(); ++t)
    		pipes[get<0>(*t)].insert(make_pair(get<1>(*t),get<2>(*t)));
     
    	PrintPipeNetwork(pipes);
     
    	getchar();
    	return 0;
    }
    Tu ne devrais pas travailler sur un compilateur aussi vieux (5 ans c'est une éternité dans le monde du développement logiciel).
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  17. #17
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 31
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Juillet 2014
    Messages : 41
    Points : 19
    Points
    19
    Par défaut
    Ca marche Je te remercie ! Je vais l'intégrer dans mon programme !
    Je travaille malheureusement dans une boîte où je n'ai pas le droit de venir avec mon ordinateur personnel (confidentialité, sécurité et tout).
    Je travaille donc avec les logiciels qu'ils ont et ils sont souvent bien obsolètes ! Je suis d'accord avec toi j'aurai aussi préféré travailler avec une version plus récente mais je n'ai pas le choix ... De plus ils ne disposent QUE de la version Express, je te laisse deviner toutes les librairies qu'il manque..

    Merci beaucoup en tout cas !

  18. #18
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Tu ne devrais pas travailler sur un compilateur aussi vieux (5 ans c'est une éternité dans le monde du développement logiciel).
    Mais il n'y a pas moyen d'avoir plus récent si on est coincé sous Vista ou XP (sachant que M$ ne vend plus de 7 aux particuliers).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  19. #19
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 31
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Juillet 2014
    Messages : 41
    Points : 19
    Points
    19
    Par défaut
    En effet, je suis sous XP mais ils ont quand même assez d'argent pour avoir les licences complètes de Visual Studio

  20. #20
    Membre confirmé
    Profil pro
    Consultant en technologies
    Inscrit en
    Octobre 2013
    Messages
    158
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en technologies

    Informations forums :
    Inscription : Octobre 2013
    Messages : 158
    Points : 555
    Points
    555
    Par défaut
    Citation Envoyé par r0d Voir le message
    Erf, visual 2010....
    Tu ne devrais pas travailler sur un compilateur aussi vieux (5 ans c'est une éternité dans le monde du développement logiciel).
    Si le cœur de métier n'est pas le développement logiciel, Ça ne me semble pas idiot de définir une fois pour toute un environnement de développement et une plateforme qui suivra toute la vie du projet.
    On trouve encore des antiquités (genre écrans monochrome vert) branchées sur des systèmes critiques, simplement car changer de système informatique c'est perdre du temps, prendre le risque d'ajouter de nouveaux bugs le tout sans qu'aucun gain ne soit attendu.

    C'est pas à la mode, et je deviens peut-être un vieux c... mais j'essaye de me tenir à ces deux principes on ne change pas un système qui marche et ce qui importe ce n'est pas d'écrire le logiciel mais d'en faire quelque chose

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

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