probleme lors d'un erase() sur une liste

probleme lors d'un erase() sur une liste - C++ - Programmation

Marsh Posté le 13-02-2006 à 18:13:20    

Bonjour,
 
Voila le bout de code qui pose probleme :  

Code :
  1. typedef list<data> ld;
  2. //...
  3. ld::iterator d = l.begin();
  4. while (d != l.end()) {
  5.     diffp=(u_ii - u_i)/u_ii;
  6.     diffn=(u_ii - u_iii)/u_iii;
  7.    
  8.     if (fabs(diffp + diffn) > 2) {
  9.       d--;
  10.       cout <<d->ti << " erased" << endl;
  11.       //l.erase(d);
  12.       d++;
  13.     }
  14.     u_i=u_ii;
  15.     u_ii=u_iii;
  16.     u_iii=(++d)->ti;
  17.   }


 
Quand je decommente la ligne 11 et je commente la 12, normalement je dois enlever l'element precedent.  
 
Or si la ligne 9 est décommentée, j'ai l'erreur suivante :  
 
 *** Break *** segmentation violation
 Generating stack trace...
 0x0804e258 in parser::time_eliminate() + 0x29e from ./fluorescence
 0x0804b9cd in main + 0x339 from ./fluorescence
 0xb66d9eb0 in __libc_start_main + 0xd0 from /lib/tls/i686/cmov/libc.so.6
 0x0804b611 in __gxx_personality_v0 + 0x89 from ./fluorescence
Abandon
 
Mais si elle est commentée le programme s'éxécute bien.  Quelqu'un aurait-il une idée ? Y a-t-il un probleme à se ballader dans les listes avec ++ et -- ?
 


---------------
A savoir : la dimension de Hausdorff du chou-fleur a été calculée et vaut 2.33
Reply

Marsh Posté le 13-02-2006 à 18:13:20   

Reply

Marsh Posté le 13-02-2006 à 19:17:03    

Juste quelque petits remarque, quand tu erase ton iterator est "perdu",  quand tu fais -- il faut tester par rapport l.begin(). (si tu erase le premier element).
De meme quand tu es a la fin, tu vas faire ++ 2 fois, or si tu es deja a end() ...y a un probleme..
Enfin a vue de nez vite fait comme ca, c'est dans les tests de limite qu'il y a un probleme

Reply

Marsh Posté le 13-02-2006 à 20:38:34    

francky06l a écrit :

Juste quelque petits remarque, quand tu erase ton iterator est "perdu",  quand tu fais -- il faut tester par rapport l.begin(). (si tu erase le premier element).


 
Je croyais que erase() poussait mon iterator à l'élément suivant celui que je venais de supprimer. C'est pour cela que je simulais erase() par d++ . Ca change selon les compilateurs ?
 
 
Sinon mon code n'est pas finalisé donc il est possible qu'il y ait des problémes aux bords. Je regarderai.
 
Merci


Message édité par Photonium le 13-02-2006 à 20:40:24

---------------
A savoir : la dimension de Hausdorff du chou-fleur a été calculée et vaut 2.33
Reply

Marsh Posté le 14-02-2006 à 07:12:00    

Je suis certain que erase n'incremente pas l'iterator (pour les STLPort au moins), par contre il retourne un iterator sur l'element suivant (donc faudrait faire quelque chose du genre d = l.erase(d)).

Reply

Marsh Posté le 14-02-2006 à 10:15:21    

oui exactement, il faut en faire quelque chose du retour de erase()

Reply

Marsh Posté le 14-02-2006 à 12:15:38    

Taz a écrit :

oui exactement, il faut en faire quelque chose du retour de erase()


 
Merci, ça a l'air de marcher maintenant. Le pire, c'est que je ne faisais pas le d= pour une autre boucle et ça avait l'air de marcher...
 
A une prochaine.


---------------
A savoir : la dimension de Hausdorff du chou-fleur a été calculée et vaut 2.33
Reply

Sujets relatifs:

Leave a Replay

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