Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1226 connectés 

  FORUM HardWare.fr
  Programmation
  C++

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°710959
Evadream -​jbd-
Posté le 28-04-2004 à 14:54:46  profilanswer
 

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 !
 
@+

mood
Publicité
Posté le 28-04-2004 à 14:54:46  profilanswer
 

n°710965
myst78
Posté le 28-04-2004 à 14:57:29  profilanswer
 

c'est quoi l'erreur exactement ?


---------------
Fleur de métal, entité invulnérable, vêtue tant bien que mal, d'une muraille inébranlable...
n°710966
jagstang
Pa Capona ಠ_ಠ
Posté le 28-04-2004 à 14:58:19  profilanswer
 

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

n°710994
Evadream -​jbd-
Posté le 28-04-2004 à 15:12:30  profilanswer
 

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
n°710998
myst78
Posté le 28-04-2004 à 15:17:13  profilanswer
 

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...
n°711015
Kristoph
Posté le 28-04-2004 à 15:27:36  profilanswer
 

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.

n°711026
SoWhatIn22
Posté le 28-04-2004 à 15:32:46  profilanswer
 

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. }


n°711047
Evadream -​jbd-
Posté le 28-04-2004 à 15:40:33  profilanswer
 

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
n°711140
SoWhatIn22
Posté le 28-04-2004 à 16:36:35  profilanswer
 

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?

n°711168
Evadream -​jbd-
Posté le 28-04-2004 à 17:04:28  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

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

 

Sujets relatifs
[Javascript] Probleme javascript pour afficher [Résolu] Mysql - Petit problème de clé primaire -
[PHP]Problème avec les variables de sessionProbleme avec un select
Probleme permutation ligne tableau[PHP]Problème d'insertion bizarre [resolu]
Probleme de compilationProbleme PHP et Requete
problème de requêteprobleme avec une requete sous vb6 sur une chaine de caractere ....
Plus de sujets relatifs à : [C++/STL] list et parcours avec un itérateur : problème


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR