[C++/STL] list et parcours avec un itérateur : problème

list et parcours avec un itérateur : problème [C++/STL] - C++ - Programmation

Marsh Posté le 28-04-2004 à 14:54:46    

Bonjour tout le monde,
 
J'ai un petit soucis avec un parcours de list. Ca doit être quelque chose d'assez évident, mais je ne le vois pas. Voici le code qui segfault :
 

Code :
  1. #include <iostream>
  2. #include <list>
  3. using namespace std ;
  4. struct XY {
  5. unsigned x,y ;
  6. } ;
  7. struct pix {
  8. XY coord ;
  9. } ;
  10. struct conteneur {
  11. list<pix>* pixels ;
  12. conteneur()  { pixels = new list<pix> ; }
  13. ~conteneur() { delete pixels ; }
  14. } ;
  15. int main(int argc, char* argv[])
  16. {
  17. conteneur foo ;
  18. pix fake1 = {0,1} ;
  19. pix fake2 = {2,3} ;
  20. pix fake3 = {4,5} ;
  21. foo.pixels->push_back( fake1 ) ;
  22. foo.pixels->push_back( fake2 ) ;
  23. foo.pixels->push_back( fake3 ) ;
  24. list<conteneur> bar(10, foo) ;
  25. list<conteneur>::iterator i = bar.begin() ;
  26. while ( i != bar.end() ) {
  27.  list<pix>::iterator j = (*i).pixels->begin() ;
  28.  while ( j != (*i).pixels->end() ) ++j ;
  29.  ++i ;
  30. }
  31. }


 
Est-ce que ca vous saute aux yeux ?
Merci pour votre aide !
 
@+

Reply

Marsh Posté le 28-04-2004 à 14:54:46   

Reply

Marsh Posté le 28-04-2004 à 14:57:29    

c'est quoi l'erreur exactement ?


---------------
Fleur de métal, entité invulnérable, vêtue tant bien que mal, d'une muraille inébranlable...
Reply

Marsh Posté le 28-04-2004 à 14:58:19    

je pige pas pourquoi tu utilises des itérateur, c'est c'est pour faire while (i != ) et ++i ;
 
utilise foreach

Reply

Marsh Posté le 28-04-2004 à 15:12:30    

myst78 a écrit a écrit :

c'est quoi l'erreur exactement ?




 
segfault [:ddr555]
 

JagStang a écrit a écrit :

je pige pas pourquoi tu utilises des itérateur, c'est c'est pour faire while (i != ) et ++i ;
utilise foreach




 
Comment on fait pour parcourir une liste et effectuer un traitement différent pour certains de ses élements ? Même si ca n'est pas la solution la plus élégante j'aimerais bien comprendre pourquoi ca ne fonctionne pas.


Message édité par Evadream -jbd- le 28-04-2004 à 15:12:42
Reply

Marsh Posté le 28-04-2004 à 15:17:13    

hmm la comme ca je vois pas moi
t'as essaye un mode debug pour voir a quelle iteration ca plante ?


---------------
Fleur de métal, entité invulnérable, vêtue tant bien que mal, d'une muraille inébranlable...
Reply

Marsh Posté le 28-04-2004 à 15:27:36    

Code :
  1. list<conteneur> bar(10, foo) ;
  2. list<conteneur>::iterator i = bar.begin() ;


 
Avec ces 2 lignes, tu crée 10 copies de foo que tu met dans la liste bar. Hors, comme tu n'as pas de constructeur par recopie, chacun de ces foo se partage le pointeur pixel. Il suffit que cette ligne déclenche la construction d'un objet temporaire qu'elle desaloue imédiatement pour que la liste pixel soit desalouée et que toutes tes copies de l'objet foo  dans la liste bar se retrouvent avec un pointeur vers une zone de mémoire manquante.

Reply

Marsh Posté le 28-04-2004 à 15:32:46    

grillaid :(
je dirais donc même plus, c à la destruction que ça plante.
si tu ne veux pas d'erreur, n'utilise pas de pointeurs, ou défini un constructeur par recopie.
ceci devrait fonctionner.

Code :
  1. #include <iostream>
  2. #include <list>
  3. using namespace std ;
  4. struct XY {
  5.    unsigned x,y ;
  6. } ;
  7. struct pix {
  8.    XY coord ;
  9. } ;
  10. struct conteneur {
  11.    list<pix> pixels ;
  12. //   conteneur()  { pixels = new list<pix> ; }
  13. //   ~conteneur() { delete pixels ; }
  14. } ;
  15. int main(int argc, char* argv[])
  16. {
  17.    conteneur foo ;
  18.  
  19.    pix fake1 = {0,1} ;
  20.    pix fake2 = {2,3} ;
  21.    pix fake3 = {4,5} ;
  22.    
  23.    foo.pixels.push_back( fake1 ) ;
  24.    foo.pixels.push_back( fake2 ) ;
  25.    foo.pixels.push_back( fake3 ) ;
  26.  
  27.    list<conteneur> bar(10, foo) ;
  28.    list<conteneur>::iterator i = bar.begin() ;
  29.  
  30.    while ( i != bar.end() ) {
  31.       list<pix>::iterator j = (*i).pixels.begin() ;
  32.    
  33.       while ( j != (*i).pixels.end() ) ++j ;
  34.      
  35.       ++i ;
  36.    }
  37.    cout << "done";
  38.    cin.ignore();
  39.    cout << endl;
  40.    return 0;
  41. }


Reply

Marsh Posté le 28-04-2004 à 15:40:33    

Kristoph > Bien vu ! Merci à toi.

Code :
  1. struct conteneur {
  2.         list<pix>* pixels ;
  3.         conteneur()  { pixels = new list<pix> ; }
  4.         ~conteneur() { delete pixels ; }
  5.         conteneur(const conteneur& c) {
  6.                  pixels = new list<pix>(*(c.pixels)) ;
  7.         }
  8. } ;


 
SoWhatIn22 > Ze veux (j'ai besoin) de mes pointeurs ! ;)
 
Merci à tous pour vos interventions et votre aide !
 
@++


Message édité par Evadream -jbd- le 28-04-2004 à 17:04:48
Reply

Marsh Posté le 28-04-2004 à 16:36:35    

pas du tout une bonne idée, le delete dans ton constructeur par recopie, puisque tu détruis de la mémoire non allouée. A la recherche du nouveau segfault?

Reply

Marsh Posté le 28-04-2004 à 17:04:28    

Copier/coller malheureux, merci de l'avoir fait remarquer.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed