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 :

liste chaine: boucle infini dans la procedure daffichage


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    164
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 164
    Points : 64
    Points
    64
    Par défaut liste chaine: boucle infini dans la procedure daffichage
    salut

    voila jai une liste chainée avec un procedure d'intersion qui insert au debut ou au milieu de ma liste mes objets (des chocolat classé par poids)


    j'ai crée une procedure de parcours qui fonctionne tres bien pour linsertion au debut mais pas pour linsertion au milieu

    je ne comprend pas pourquoi cela plante
    donc voici la procedure d'insertion au milieu:

    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
     
    //Les chocolats seront classés par poid 
    void liste_chocolat::insertion_milieu(chocolat *ptinsert)
    {
    	//declaration de ptcoutant et ptprecedent : pointeur de chocolat
    	chocolat *ptcourant;
    	chocolat *ptprecedent;
     
    	//ptcourant recoit premier
    	ptcourant=premier;
     
    	/*tant que ptcourant n'est pas nul et que le poid de ptinsert est surpperieur a celui de ptcourant faire
    		ptprecedent recoit ptcourant
    		ptcourant recoit ptinsert
    	fin de boucle*/
    	while((ptcourant!=NULL)&&(ptinsert->get_poid()>ptcourant->get_poid()))
    	{
    		ptprecedent=ptcourant;
    		ptcourant=ptinsert;
    	}
     
    	ptinsert->setsuivant(ptcourant);
    	ptprecedent->setsuivant(ptinsert);
    }
    et voici la procedure de parcours:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
    void liste_chocolat::parcours()
    {
    	// declaration d'un pointeur ptcourant de type chocolat//
    	chocolat *ptparcours;
     
    	ptparcours= premier;
    	while (ptparcours!=NULL)
    	{
    		ptparcours->affichage();
    		ptparcours=ptparcours->getsuivant();
    	}
    }
    voila merci par avance

  2. #2
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Points : 5 778
    Points
    5 778
    Par défaut
    je suppose que "premier" est la tete de liste, tu doit lui-aussi le passer en parametre

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    164
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 164
    Points : 64
    Points
    64
    Par défaut
    Citation Envoyé par le y@m's
    je suppose que "premier" est la tete de liste, tu doit lui-aussi le passer en parametre
    ok je doit le passe mais dans quelle procedure laffichage ou linsertion au milieu?

    car laffichage avec linsertion au debut fonctionne correctement

    donc je sai spas si sa vient vraiment de mon affichage ou de mon insertion au milieu


    merci
    ps voici linsertion au debut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    void liste_chocolat::insertion_debut(chocolat *ptinsert)
    {
     
    	ptinsert->setsuivant(premier);
    	premier=ptinsert;
    }

  4. #4
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Points : 5 778
    Points
    5 778
    Par défaut
    a moins que tu n'ais declaré "premier" en global (à eviter), celui-ci est inconnu dans tes fonctions, c'est pour ça que tu doit passer ta tete de liste à toute tes fonctions qui l'utilisent.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    164
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 164
    Points : 64
    Points
    64
    Par défaut
    bin en fait premier, c'est effectivement mon premier objet de la liste
    mais je linitialise avec un constructeur de ma classe liste dont voici le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    liste_chocolat::liste_chocolat()
    {
        premier=new chocolat;
    	premier->saisie();
    	premier->setsuivant(NULL);
     
    }
    en fait premier c mon premier objet chocolat apres dans mon programme principal je creer un autre chocolat si son poid est inferieur a celui de premier alors il est inserer avant premier et la aucun souci pour afficher les 2 objet grace a ma liste parcours
    sinon sil est plus lours alors sa laffiche apres premier et la sa tourne sans fin

    alors je pense que le probleme ne vient pas de ma procedure de parcours mais de mon insertion milieu

    mais je peus me trompé

    par contre je ne comprned tjs pas ou tu veus que je mette premier en parametre si c dans la procedure parcours ou insertion milieu?


    merci de ton aide en tout cas car je takine pas trop le c++

  6. #6
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Points : 5 778
    Points
    5 778
    Par défaut
    desole j'avais pas compris, effectivement, ya pas besoin de passer premier en parametre etant donne que c'est un membre de ta classe, encore desole je vais me pencher un peu plus sur l'algo.

  7. #7
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Points : 5 778
    Points
    5 778
    Par défaut
    je crois que j'ai trouvé,
    dans ta boucle, normalement "ptcourant" doit reçevoir "ptcourant->getsuivant()" et pas "ptinsert".

  8. #8
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    je ne comprend pas pourquoi cela plante
    Essaye déjà d'utiliser le debugger ou au pire de mettre des traces dans ton code, pour localiser un peu mieux l'erreur.

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    164
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 164
    Points : 64
    Points
    64
    Par défaut
    Citation Envoyé par le y@m's
    je crois que j'ai trouvé,
    dans ta boucle, normalement "ptcourant" doit reçevoir "ptcourant->getsuivant()" et pas "ptinsert".

    petar exellent ct sa mon erreur

    en tout cas merci

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    164
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 164
    Points : 64
    Points
    64
    Par défaut
    re

    je reviens pour poser une derniere question car je suis en train de mettre des commentaire pour pas oublier

    donc voici ma question tjs pour la procedure dinsertion milieu:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    	while((ptcourant!=NULL)&&(ptinsert->get_poid()>ptcourant->get_poid()))
    	{
    		ptprecedent=ptcourant;
    		//pt courant = ptsuivant par l'accesseur getsuivant()
    		ptcourant=ptcourant->getsuivant();
     
    	}
     
    	ptinsert->setsuivant(ptcourant);
    	ptprecedent->setsuivant(ptinsert);
     
    }
    ptinsert->setsuivant(ptcourant) : cela signifie que ptinsert est attibué comme le suivant de ptcourant

    voici ma procedure setsuivant()
    void chocolat::setsuivant(chocolat *psuivant)
    {
    suivant=psuivant; //donne le suivant
    }

    merci par avance

  11. #11
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Points : 5 778
    Points
    5 778
    Par défaut
    c'est quoi ta question ?

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    164
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 164
    Points : 64
    Points
    64
    Par défaut
    Citation Envoyé par le y@m's
    c'est quoi ta question ?
    ta vu apres ma boucle tant que il y a

    ptinsert->setsuivant(ptcourant)

    cela signifie que ptcourant devient le suivant de ptinsert ou ptinsert devient le suivant de ptcourant

    car comme en dessous je mets ptprecedent->setsuivant(ptinsert)
    or ptprecendent=ptcourant par la boucle

    sa fait que je comprend plus ces 2 lignes

    car c juste pour mettre une phrase en comentaire car je commence a membrouillié et comme je commence a comprendre la programmation objet alors avec les pointeurs sa devient farfelu

  13. #13
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Points : 5 778
    Points
    5 778
    Par défaut
    or ptprecendent=ptcourant par la boucle
    oui mais juste après ptcourant=ptcourant->getsuivant() donc en fait ptcourant est le suivant de ptprecedent, puis tu insere ptinsert entre les deux quand tu sort de la boucle.
    cqfd

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    164
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 164
    Points : 64
    Points
    64
    Par défaut
    Citation Envoyé par le y@m's
    or ptprecendent=ptcourant par la boucle
    oui mais juste après ptcourant=ptcourant->getsuivant() donc en fait ptcourant est le suivant de ptprecedent, puis tu insere ptinsert entre les deux quand tu sort de la boucle.
    cqfd
    ok merci je vais mettre un gros commentaire car comme je prepare sa pour un examen oral s'ils me pose la question et que je sais pas torp lexpliké aille

    merci en tout cas de ton aide
    ++

  15. #15
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Points : 5 778
    Points
    5 778
    Par défaut
    pour te faciliter la comprehension :
    [oral]
    ptprecedent=ptcourant;
    veut dire que ptprecedent pointe vers l'element courant
    ptcourant=ptcourant->getsuivant();
    veut dire que ptcourant pointe vers l'element suivant
    donc à ce stade :
    ptprecedent represente l'element courant
    et ptcourant represente l'element suivant

    d'où la difficulté de comprehension. n'hesite pas à mettre 1 tonne de commentaires (si un jour tu y reviens apres un certain temps, tu les aprecieras).
    bonne prog

  16. #16
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    164
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 164
    Points : 64
    Points
    64
    Par défaut
    merci beaucoup
    ++

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

Discussions similaires

  1. Liste chainée & boucle infinie
    Par emixam16 dans le forum C
    Réponses: 9
    Dernier message: 03/06/2015, 12h31
  2. probleme de boucle while dans une procedure stockée
    Par aboulemagnifique dans le forum SQL Procédural
    Réponses: 6
    Dernier message: 08/08/2007, 12h39
  3. Réponses: 1
    Dernier message: 28/07/2006, 11h11
  4. Réponses: 29
    Dernier message: 17/06/2006, 13h04
  5. symptome de la boucle infinie dans une requete
    Par ouam81 dans le forum Langage SQL
    Réponses: 8
    Dernier message: 27/05/2005, 12h10

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