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 :

boucle infinie en C++


Sujet :

C++

Vue hybride

nina2007 boucle infinie en C++ 29/10/2009, 13h21
white_tentacle Quelques remarques : - le... 29/10/2009, 14h04
nina2007 merci pour ta réponse au... 29/10/2009, 14h24
3DArchi Salut, Tout pareil que... 29/10/2009, 17h34
nina2007 mes chers amis, pour vous... 29/10/2009, 20h11
Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé

    Inscrit en
    Août 2007
    Messages
    308
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 308
    Billets dans le blog
    1
    Par défaut boucle infinie en C++
    Bonjour à tous,

    J'ai un problème que j'arrive pas à résoudre
    tout me semble correcte et à la fois, j'arrive pas à tenir le bout du fil

    Voilà, je fais un parcours d'un set d'entiers (ensemble_entier dans le code)
    aprés je cherche dans un map l'element dont l'id est l'entier courant du set.
    Le deuxième element de mon map est une regle ( exempe de regle 1 3 -> 4)
    donc une regle est constituée d'une partie premisse (ici 1 3) qui est un set d'entiers
    {1 ,3} et une partie conclusion (conc= 4: entier)

    donc dans mon code les méthodes retourner_conclusion() et retourner_premisse()
    permettent de retourner respectivement la conlusion et la premisse d'une regle

    Le problème, c'est que mon code marche bien quand je ne fais pas appel à retourner_premisse().

    avec retourner_premisse, ce bout de code boucle jusqu'à l'infini
    sachant que dans retourner_premisse(), je fais juste un return premisse
    et que ça marche bien dans d'autres parties de mon programme

    merci si vous avez une idée


    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
     
    //conc est une entier
    //premisse est un set d'entiers
    for(set<int>::iterator i=ensemble_entier.begin();i!=ensemble_entier.end();i++)
    {
     
    cout<<"je vais chercher l'element "<<(int)*i;
    map<int, regle > ::iterator m = regles.find((int)*i);
     
    conc=(*m).second.retourner_conclusion();
    cout<<"conclusion ="<<conc;
     
     
    // c'est cette partie du code qui génére une boucle infinie
    p=(*m).second.retourner_premisse();
    cout<<"premisse ";afficher_set(p);
    }

  2. #2
    Membre Expert
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Par défaut
    Quelques remarques :

    - le cast en (int) de *i n'est pas nécessaire : enlève-le, ça augmentera la lisibilité du programme.
    - plutôt que d'utilise (*m).second, utilise m->second, là aussi ça augmentera la lisibilité.

    Sinon, rien de choquant dans cette boucle, peux-tu poster le code de la classe regle, et de afficher_set (qui me semble un bon candidat si tu dit que premisse ne fait qu'un return) ?

  3. #3
    Membre éclairé

    Inscrit en
    Août 2007
    Messages
    308
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 308
    Billets dans le blog
    1
    Par défaut
    merci pour ta réponse

    au fait, c'est pas le problème d'afficher_set
    car en réalité je le met en commentaire
    ce qui cause le problème c'est retourner_premisse
    dont le code est comme je te l'ai dit, ne fait qu'un simple return


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    set<int> regle::retourner_premisse()
    {
    return premisse;
     
    }
    la spécification de regle est comme suit


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Class regle
    { set<int> premisse;
      int conclusion;
     set<int> objets;}


    voilà je suis

  4. #4
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Salut,
    Tout pareil que white_tentacle. A priori rien ne semble indiquer un problème. La seule chose est que se passe-t-il si regles.find(*i) retourne un itérateur invalide ? Je crois que cela doit générer une exception. Peut être il faut tester ce cas.

  5. #5
    Membre éclairé

    Inscrit en
    Août 2007
    Messages
    308
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 308
    Billets dans le blog
    1
    Par défaut
    mes chers amis,

    pour vous faciliter la comprehension de mon problème j'ai omis un petit détail
    le fait qu'en realité j'utilise pas ensemble_entier mais (*it).second.retourner_regles() (qui retourne un ensemble entier) et c'etait précisement ce petit détail qui m'a causé problème
    donc ce qui m'a crée le problème c'etait le fait de faire

    for(set<int>::iterator i=(*it).second.retourner_regles().begin();i!=(*it).second.retourner_regles().end();i++)

    en faisant

    s=(*it).second.retourner_regles();
    for(set<int>::iterator i=s.begin();i!=s.end();i++)

    le problème a été résolu

  6. #6
    Membre Expert
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Par défaut
    Cela montre avant tout que si tu cherches une réponse à ton problème, il faut poster tout le code et pas juste un bout, ou au moins vérifier que ce bout reproduit bien le problème .

    Au-delà de ça, as-tu compris pourquoi ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for(set<int>::iterator i=(*it).second.retourner_regles().begin();i!=(*it).second.retourner_regles().end();i++)
    et ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    s=(*it).second.retourner_regles();
    for(set<int>::iterator i=s.begin();i!=s.end();i++)
    sont différents ?

    Cela devrait t'amener à te poser des questions sur l'implémentation de ta classe regle (et notamment de la méthode retourner_regles).

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

Discussions similaires

  1. [Boucle Infinie] pour un menu
    Par NhyMbuS dans le forum C++
    Réponses: 5
    Dernier message: 20/07/2005, 09h14
  2. symptome de la boucle infinie dans une requete
    Par ouam81 dans le forum Langage SQL
    Réponses: 8
    Dernier message: 27/05/2005, 12h10
  3. Réponses: 15
    Dernier message: 24/05/2005, 08h34
  4. [Socket] Pb de boucle infinie
    Par Myogtha dans le forum Entrée/Sortie
    Réponses: 12
    Dernier message: 10/06/2004, 14h10
  5. [C#] Comment eviter les boucles infinies ?
    Par Thomas Lebrun dans le forum C#
    Réponses: 12
    Dernier message: 09/06/2004, 00h04

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