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++ - Problème parcours de deux boucles FOR imbriquées


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 : 32
    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++ - Problème parcours de deux boucles FOR imbriquées
    Bonjour,

    Je suis confrontée à un problème que je n'arrive pas à résoudre et surtout je ne comprend pas pourquoi le code pose problème.
    Je dispose de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    list<pair<int, string>> TypeList;
    list<pair<int, int>> ClassList;
    Et de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    list<pair<int,string>>::iterator iter = TypeList.begin();
    list<pair<int,int>>::iterator iter1 = ClassList.begin();
    Je parcours deux listes dans deux boucles FOR imbriquées et je souhaite vérifier que si le premier element de chaque paire est le même alors ...
    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(;iter != TypeList.end(); iter++) 
    { 
    	cout << "Premier passage : " << (*iter).first << endl;
    	getchar();
    	for(;iter1 != ClassList.end(); iter1++)
    	{
    		cout << "deuxième passage : " << (*iter1).first << endl;
    		getchar();
    		if ((*iter1).first == (*iter).first)
    		{
    			cout << "troisième passage : " << (*iter).first << " et " << (*iter1).first << endl;
    			getchar();
    		}
    	}
    }
    J'ai mis des affichage bidon pour comprendre mais la seconde boucle FOR est parcouru qu'une seule fois lors de son premier passage.
    Pourquoi on ne rentre pas dans la boucle FOR à chaque passage dans la grande boucle ?
    Si vous avez une idée (je suis sûre que c'est gros comme une maison et que je ne vois rien)

    Merci d'avance pour vos réponses

  2. #2
    Membre éclairé
    Inscrit en
    Décembre 2010
    Messages
    290
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 290
    Points : 719
    Points
    719
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      for(;iter1 != ClassList.end(); iter1++)
    Tu n'initialises pas ton itérateur. Je suppose que tu le fais AVANT le code que tu nous as montré.
    Du coup, iter1 pointe toujours sur ClassList.end(), donc on ne rentre même pas dans la boucle.

    Tu peux le remettre au début comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      for(iter1=ClassList.begin();iter1 != ClassList.end(); iter1++)
    D'une manière générale, il faut déclarer tes variables (donc aussi tes itérateurs) le plus tard possible, si possible au moment de leur première utilisation, ça évite ce genre de problèmes. Donc une meilleure approche c'est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      for(list<pair<int, int>>::iterator iter1=ClassList.begin();iter1 != ClassList.end(); iter1++)
    Je n'ai pas très bien compris ce que tu cherches à faire, mais coder des boucles soit même n'est parfois pas nécessaire, la librairie standard propose énormément d'algorithmes déjà tout faits qui répondent peut être à ce que tu veux faire.

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    je vois pas à quel moment tu reset iter1 pour espérer le reparcourir ?
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  4. #4
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    un itérateur ne se remet par magie au début de sa collection.

    Pour ca, il faut en faire une copie à chaque fois.

    ta boucle interne sera plutot faite ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for (list<pair<int,int>>::iterator it = iter1; it!=ClassList.end(); ++it) {
    Cela dit, tu es certain de vouloir faire une boucle dans une autre?
    Ca veut dire que pour chaque élément de TypeList, tu va parcourir intégralement ClassList et faire ta comparaison.

    J'ai l'impression que tu veux vérifier que "pour tout rang n, ClassList[n].first = TypeLit[n].first".
    Ca correspond plutôt au code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    bool check(list<pair<int, string>> const& types, list<pair<int, int>> const& classes) {
        if (types.size() != classes.size()) return false;
     
        list<pair<int, string>>::const_iterator typeIt = types.begin();
        list<pair<int, int>>::const_iterator classIt= classes.begin();
     
        for (; typeIt!=types.end() && classIt!=classes.end(); ++typeIt, ++classIt) {
            if(typeIt->first!=classIt->first) return false;
        }
        return true;
    }
    J'en profite pour supprimer le détail d'implémentation du nom des variables. un pluriel est largement suffisant comme information. Et si tu passes à un set, le suffixe List devient faux.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  5. #5
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 32
    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 pour vos réponses.

    En effet, j'avais oublié de mettre la partie d'initialisation (copier/coller avec une autre boucle ailleurs dans mon code qui n'en necessitait pas).
    Je savais que l'erreur était facile à détecter mais lorsqu'on a la tête dans le même code pendant plusieurs jours, on ne voit plus rien..

    Merci de votre aide !

  6. #6
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Avec <algorithm>, tu dois même pouvoir t'en sortir en très peu de code.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include <algorithm>
    namespace{ 
    bool same_keyed(pair<int, string> const& type, pair<int, int> const& classe) {
        return type.first == classe.first;
    }
    }
     
    bool check(list<pair<int, string>> const& types, list<pair<int, int>> const& classes) {
        if (types.size() != classes.size()) return false;
     
        return std::equal(types.begin(), types.end(), classes.first(), same_keyed);
    }


    Du coup, penses à ma signature: "Un copier-coller, ça doit se justifier... Deux, c'est un de trop."
    Le copier collé, amène ce genre d'erreur
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  7. #7
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 32
    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 vraiment pour tes astuces ! Je vais de ce pas améliorer mon code !
    Merci encore !

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

Discussions similaires

  1. deux boucles for non imbriquées
    Par ebenmous dans le forum Langage
    Réponses: 3
    Dernier message: 24/06/2011, 11h53
  2. Sortir de deux boucles FOR-END imbriquées
    Par Nabuchodonosor15 dans le forum MATLAB
    Réponses: 5
    Dernier message: 31/08/2009, 09h58
  3. problème avec n boucles FOR imbriquées
    Par neopi21 dans le forum Général Java
    Réponses: 9
    Dernier message: 09/06/2009, 10h36
  4. Réponses: 3
    Dernier message: 24/05/2007, 17h56
  5. Batch - Deux boucle For imbriquées plus un FC
    Par Lorponos dans le forum Windows
    Réponses: 17
    Dernier message: 27/07/2006, 14h58

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