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

SL & STL C++ Discussion :

Iterateur sur une list


Sujet :

SL & STL C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    91
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 91
    Par défaut Iterateur sur une list
    Bonjour,

    mon problème est le suivant : j'aimerais parcourir une list avec un iterator, non const car j'appelle des méthodes des objets contenus dans la collection, et tout se passe très bien jusqu'à l'exécution où, au 2e parcours de la collection (car j'itère à l'intérieur d'une autre boucle), le programme plante et j'obtiens un zouli message d'erreur :

    Debug assertion failed !
    ...
    Expression : list iterator not dereferencable
    ...
    Voici mon code :

    d'abord où j'initialise la list :
    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
     
    list<SjSl_Balloon> ballons;
    SjSl_Timer timer;
     
    srand(time(NULL));
    for(unsigned int x=0; x<dim[0]; x++){
    	for(unsigned int y=0; y<dim[1]; y++){
    		for(unsigned int z=0; z<dim[2]; z++){
    			int pos[3]={x, y, z};
    			for(unsigned int nbBallon=0; nbBallon<SjSl_Random::GetInt(0, 3); nbBallon++){
    				SjSl_Balloon tmp(timer, pos);
    				ballons.push_back(tmp);
    			}
    		}
    	}
    }
    et ensuite où je l'utilise :
    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
     
    list<SjSl_Balloon>::iterator itB;
    list<SjSl_WeatherStation>::iterator itS;
    list<SjSl_WeatherStation> stations=earth.GetStations();
    while(true){
    	for(unsigned int d=0; d<31; d++){
    		for(unsigned int h=0; h<24; h++){
    			for(unsigned int mn=0; mn<60; mn++){
    				for(unsigned int s=0; s<60; s++){
    					int currentTime[4]={d, h, mn, };
    					timer.SetTime(currentTime);
                                                                    _sleep(10);
    				}
    			}
    			itB=ballons.begin();
    			for(; itB!=ballons.end(); itB++){
    				(*itB).Move(earth);
    				cout<<*itB<<endl;
    			}
    		}
    		itS=stations.begin();
    		for(; itS!=stations.end(); itS++){
    			(*itS).BulletinMeteo();
    			cout<<"Bulletins météo rangés dans le répertoire ulletins"<<endl;
    		}
    	}
    }
    Je n'arrive vraiment pas à comprendre d'où le problème peut venir car tout se passe au premier de la list ballons. En ce qui concerne la liste stations, je n'ai pas encore pu tester puisque le programme n'arrive pas jusque là...

  2. #2
    Membre expérimenté
    Profil pro
    Dev
    Inscrit en
    Décembre 2007
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dev

    Informations forums :
    Inscription : Décembre 2007
    Messages : 191
    Par défaut
    Est ce que tes méthodes modifient ton conteneur ? Car dans ce cas les itérateurs deviennent invalides, et ne peuvent plus être déréférencés.

    PS : utilises ++it au lieur de it++ dans le for, ça ne change pas grand chose mais évite de faire une copie inutile.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    91
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 91
    Par défaut
    En fait, dès lors que le conteneur ballons est initialisé et remplit (donc dans la première boucle), il n'est plus modifié par aucune méthode.

    Je vais essayer en mettant ++it.

    Merci pour ton aide !

    Edit : testé avec ++it au lieu de it++ et... ben rien ne change à l'exécution Toujours ce foutu problème.

  4. #4
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Bonjour,
    à quoi ressemble le createur par recopie de SjSl_Balloon ??
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int currentTime[4]={d, h, mn, };
    il ne manque pas quelque chose?

    que fait la fonction "(*itB).Move(earth);" ?

  5. #5
    Membre expérimenté
    Profil pro
    Dev
    Inscrit en
    Décembre 2007
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dev

    Informations forums :
    Inscription : Décembre 2007
    Messages : 191
    Par défaut
    Citation Envoyé par Atharendil Voir le message
    Je vais essayer en mettant ++it.

    Merci pour ton aide !

    Edit : testé avec ++it au lieu de it++ et... ben rien ne change à l'exécution Toujours ce foutu problème.
    Juste par rapport à ça : ce n'était absolument pas censé réglé le problème, juste une petite habitude à prendre qui ne mange pas de pain pour optimiser très légèrement ton programme.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    91
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 91
    Par défaut
    Ok paco tout conseil est bon à prendre, j'essaierais d'y penser

    Mongaulois-> En fait, pour le tableau, c'est juste un pb de recopie dans le forum, le compilo aurait pas aimé sinon
    Il manquait ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int currentTime[4]={d, h, mn, s};
    Voilà le constructeur par recopie de SjSl_Balloon :
    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
     
    SjSl_Balloon::SjSl_Balloon(const SjSl_Balloon& balloon):
    timer(balloon.timer), hygrometer(balloon.hygrometer), windGauge(balloon.windGauge), thermometer(balloon.thermometer), humidityValue(balloon.humidityValue), windValue(balloon.windValue), temperatureValue(balloon.temperatureValue), balloonNumber(balloon.balloonNumber)
    {
    	for(int i=0;i<3;i++)
    	{
    		position[i] = balloon.position[i];
    	}
     
    	for(int i=0;i<3;i++)
    	{
    		windDirection[i] = 0;
    	}
    	numberOfBalloon++;
    }
    Et en ce qui concerne la fonction Move, elle modifie la plupart des attributs d'un SjSl_Balloon et en particulier met à jour la position puis fait appel à des méthodes de earth (qui est un SjSl_Atmosphere).

  7. #7
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    ? bizarre pour une recopie...

    Sinon ça a l'air ok.

    As tu essayé sans appeler Move ?? (y aurait il pas des division par windDirection , des pointeurs ou un parcoure mémoire dans cette fonction?)

    Pour bien comprend :
    Le premier parcoure de la list ne pose pas de problème,
    mais le second oui. C'est bien cela?

    Tu est sous visual?

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 26/09/2010, 18h48
  2. [List] Iterateur sur une liste de type défini
    Par Wookai dans le forum SL & STL
    Réponses: 4
    Dernier message: 12/11/2007, 20h45
  3. pb avec iterateur const sur une list STL
    Par Muetdhiver dans le forum SL & STL
    Réponses: 4
    Dernier message: 14/01/2007, 16h39
  4. Réponses: 3
    Dernier message: 06/09/2006, 18h59
  5. [Débutant][jsp] évènement sur une liste
    Par phoebe dans le forum Servlets/JSP
    Réponses: 5
    Dernier message: 14/05/2004, 10h53

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