Partage
  • Partager sur Facebook
  • Partager sur Twitter

Probleme de liste

perte des éléments d'une liste

Sujet résolu
    2 août 2007 à 16:38:49

    Bonjour, je vais tenter d'exposer mon problème
    J'ai une liste d'objets Population listPopulation où chaque Population contient deux listes d'objets Individu, listIndividu et listMigrants
    Le principe est de parcourir la listIndividu pour séléctionner au hasard un Individu qui ira dans la listMigrants d'une autre Population popcible .

    Seulement par la suite quand je veux récupérer mes Individu de la listMigrants de la Population popcible, celle-ci est vide...

    J'ai bien vérifié elle se rempli pourtant au moment de l'envoi des Individu d'une liste à l'autre...

    Voila les bouts de codes qui correspondent :


    main(){
    for (list<Population>::iterator iP = listPopulation.begin(); iP != listPopulation.end(); ++iP){
        iP->migration();
        }
    for (list<Population>::iterator iP = listPopulation.begin(); iP != listPopulation.end(); ++iP){
        iP->compositionPop();
        }
    }
     

    Migration

    void Population::migration(){
    int selectionF = rand() % listIndividuF.size();
    int sF=0;
    for (list<Individu>::iterator iiF = listIndividuF.begin(); iiF != listIndividuF.end(); ++iiF){
        if(sF == selectionF){
              popcible->ajoutMigrants(*iiF);
              listIndividuF.erase(iiF);
              break;
              }
        ++sF;
        }
    }


    Ajout des migrants

    void Population::ajoutMigrants(Individu ind){
         std::cout << "ind n°: " << ind.getIdin()<<std::endl; //permet de vérifier l'identité de l'individu
         listMigrants.push_back(ind).
         std::cout << "Taille = "<< listMigrants.size() <<std::endl;
    }


    La taille et l'identité de l'individu sont correctes


    Vérification des listes

    void Population::compositionPop(){
         for(list<Individu>::iterator iiF = listIndividuF.begin(); iiF != listIndividuF.end(); iiF++){
                                       std::cout << "femelle = "<<  iiF->_idin <<std::endl;
                                       }
         std::cout << "taille =  "<< listMigrants.size() <<std::endl
         for(list<Individu>::iterator iiMi = listMigrants.begin(); iiMi != listMigrants.end(); iiMi++){
                                       std::cout << "migrant"<<  iiMi->_idin <<std::endl;
                                       }
         }


    Et donc là, ma liste listMigrants est vide!!!!
    Bien sûr la listIndividu est remplie et il y manque les Individu qui ont migré

    Voilà, j'espère que vous avez saisi mon problème...

    Je suis quasiment sûr que c'est une histoire de pointeur ou de référence mais j'avoue que je m'embrouille toujours de ce côté-là :euh:

    Merci d'avance pour votre aide
    • Partager sur Facebook
    • Partager sur Twitter
      2 août 2007 à 17:52:28

      Où définis-tu popcible?
      • Partager sur Facebook
      • Partager sur Twitter
        2 août 2007 à 18:56:14

        popCible est devenu iPC depuis mon dernier message mais ça ne change rien

        Alors toujours dans la migration :

        void Population::migration(){
        ...
        for (list<Population>::iterator iPC = listPopulation.begin(); iPC != listPopulation.end(); ++iPC){
           if (iPC->getNumPop() == numPopCible){
             std::cout << "numPopCible : " << iPC->getNumPop() << std::endl;
             if (listIndividuF.size()>0){       
                int selectionF = rand() % listIndividuF.size();
                int sF=0;
                for(list<Individu>::iterator iiF = listIndividuF.begin(); iiF != listIndividuF.end(); ++iiF){
                   if(sF == selectionF){
                         iPC->ajoutMigrants(*iiF);                                                                   
                         std::cout << "Femelle choisie" << iiF->getIdin() << std::endl;
                         listIndividuF.erase(iiF);//et on l'enleve de la pop
                         break;
                         }
                    ++sF;
                    }             
                }//fin du if size<0
            }//fin du if popcible avec numpopcible
        }//fin du for parcours de listPop
        ...
         


        l'entier numPopCible est choisi aléatoirement auparavant

        Voilà la partie du code sur le transfert d'individus
        J'ai raccourci mais y a le même principe pour les mâles, je suis pas sexiste!!!

        Je sais pas si efficace ou non comme code mais en tout cas ça ne marche pas, snif :(
        • Partager sur Facebook
        • Partager sur Twitter
          2 août 2007 à 21:24:55

          Le retrait au milieu d'un itération ne marche pas comme ça.
          C'est pas dans la FAQ C++ de developpez ?
          • Partager sur Facebook
          • Partager sur Twitter
          C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
            3 août 2007 à 15:28:30

            Ouais c'est vrai que pour le retrait c'est plutôt :

            if(sF == selectionF){
                             iPC->ajoutMigrants(*iiF);                                                                   
                             std::cout << "Femelle choisie" << iiF->getIdin() << std::endl;
                             iiF=listIndividuF.erase(iiF);
                             break;
                             }
             


            Ca ne change rien au shmilblick, mais merci quand même lmghs !!! ;)

            • Partager sur Facebook
            • Partager sur Twitter
              3 août 2007 à 15:51:00

              est-ce que listPopulation est définie en globale???????!?!?!??!?

              si c'est le cas j'imagine que tu as fait des extern dans tes autres fichiers...

              En fait si c'est le cas tu me change ca maintenant et tu la créer dans le main et la passe en paramètre par référence (constante ou non selon le besoin) à tes fonctions!!!

              ... j'insiste ;)
              • Partager sur Facebook
              • Partager sur Twitter
                3 août 2007 à 16:51:58

                Bon j'ai pas tout suivi à ce que tu disais MatteX
                listPopulation es bien définie en globale, et oui j'ai omis de le mettre dans le code ci-joint, mais listPopulation est bien aussi passée en paramètre (avec de nombreux autres (j'avais tout effacé pour un confort de lecture... :euh: et oublié de mettre ce paramètre))
                J'ai donc essayé de la passer en référence et...
                ...et ben ça marche!!!!!!

                Pinaise je savais bien que c'était un truc du genre, je sais pas si je vais réussir à me rentrer ça dans la tête :colere2:

                En tout cas, grand merci à toi MatteX !!! :)
                Une Ola en ton honneur!!! :D
                Que deviendrais-je sans tous ces ZéroS ...???
                • Partager sur Facebook
                • Partager sur Twitter
                  3 août 2007 à 17:05:29

                  Et enlève les globales de ta conception de programmes ;)

                  Seules les contantes peuvent et doivent être globales
                  • Partager sur Facebook
                  • Partager sur Twitter
                    3 août 2007 à 22:16:57

                    Appelle tes globales "singletons" et personne n'osera t'embéter avec :p
                    • Partager sur Facebook
                    • Partager sur Twitter
                    C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.

                    Probleme de liste

                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                    • Editeur
                    • Markdown