[C++] Pb de boucle for récalcitrante

Pb de boucle for récalcitrante [C++] - C++ - Programmation

Marsh Posté le 28-04-2003 à 16:13:42    

Bon, là je crois que j'ai besoin d'un oeil extérieur.
Je suis en train de coder un bout de prog de traitement d'image, en l'occurence un filtre médian.
Le problème est que quelle que soit l'image sur laquelle je travaille, le code ci-dessous s'obstine à sortir un peu vite de la boucle:

Code :
  1. CImage *
  2. CImage::mediane()
  3. {
  4.   int * tab=(int *) malloc (this->getSize() * sizeof(int));
  5.   int tmp[9];
  6.   cout<<"longueur="<<this->getLength()<<" hauteur="<<this->getHeight()<<endl;
  7.   for(int i = 1; i < this->getLength() - 1; i++)
  8.     {
  9.       cout<<"i="<<i<<endl;
  10.       for(int j = 1; j < this->getHeight() - 1; j++)
  11. {
  12.   tmp[0] = this->getVal(i-1, j-1);
  13.   tmp[1] = this->getVal(i-1, j);
  14.   tmp[2] = this->getVal(i-1, j+1);
  15.   tmp[3] = this->getVal(i, j-1);
  16.   tmp[4] = this->getVal(i, j);
  17.   tmp[5] = this->getVal(i, j+1);
  18.   tmp[6] = this->getVal(i+1, j-1);
  19.   tmp[7] = this->getVal(i+1, j);
  20.   tmp[8] = this->getVal(i+1, j+1);
  21.  
  22.   //tri du tableau
  23.   for(int k=0; k<8; k++)
  24.     for(l=k+1; l<9; l++)
  25.       if(tmp[k]>tmp[l])
  26.  {
  27.    int t=tmp[k];
  28.    tmp[k]=tmp[l];
  29.    tmp[l]=t;
  30.  }
  31.  
  32.   //On met la mediane dans le tableau temporaire
  33.   tab[i + j * this->getLength()] = tmp[4];
  34. }
  35.     }
  36.   cout<<"Ole!"<<endl;
  37.   //On met a jour l'image
  38.   for(int i = 1; i < this->getLength() - 1; i++)
  39.     for(int j = 1; j < this->getHeight() - 1; j++)
  40.       this->setVal(i,j,tab[i+j*this->getLength()]);
  41.  
  42.   delete tab;
  43.   this->writePGM("mediane.pgm" );
  44.   return this;
  45. }


Voici l'affichage que j'obtiens à l'exécution:


longueur=2470 largeur=3503
 
i=1
i=2
i=3
i=4
i=5
i=6
i=7
Ole!


Pour toutes les images i ne dépasse pas 7...et j'avoue que je ne comprends rien!:??:
 
PS: cette appli n'est là que pour quelques tests, commenter la rigueur/propreté du code n'est donc pas nécéssaire, merci...;)

Reply

Marsh Posté le 28-04-2003 à 16:13:42   

Reply

Marsh Posté le 28-04-2003 à 16:17:20    

Ben rien vu de louche non plus (?) tu peux ptet essayer pas a pas au debug ?  
et je dois dire que les ma...... non rien :D

Reply

Marsh Posté le 28-04-2003 à 16:20:17    

chrisbk a écrit :

Ben rien vu de louche non plus (?) tu peux ptet essayer pas a pas au debug ?  
et je dois dire que les ma...... non rien :D
 

...lloc ne doivent pas être castés? :whistle:  
Aucune idée de ce que je peux utiliser comme débugger là, je code sous windows98, compile avec djgpp...ché pas si gdb est inclus, v regarder!

Reply

Marsh Posté le 28-04-2003 à 16:21:04    

assure toi que this->getLength() ne varie pas
 
 
et puis ton tri du ableau l'es tres pas tres tres beau, mais bon, y a que 9 elements
 
 
et pourquoi un malloc, t'aime pas les new, pourtant tu fais un joli delete apres? y a un truc qui est pas clair pour toi je crois. C -> malloc/free, C++ new/delete new[]/delete[]. tu fais du C avec classes j'ai bien l'impression

Reply

Marsh Posté le 28-04-2003 à 16:21:53    

skeye a écrit :

...lloc ne doivent pas être castés? :whistle:  


 
Nan :D
new/delete
malloc/free
 
(pis que tu fais du malloc en C++ ?skan meme plus pratique le new )
 

Reply

Marsh Posté le 28-04-2003 à 16:28:45    

++Taz a écrit :

assure toi que this->getLength() ne varie pas
 
 
et puis ton tri du ableau l'es tres pas tres tres beau, mais bon, y a que 9 elements
 
 
et pourquoi un malloc, t'aime pas les new, pourtant tu fais un joli delete apres? y a un truc qui est pas clair pour toi je crois. C -> malloc/free, C++ new/delete new[]/delete[]. tu fais du C avec classes j'ai bien l'impression


mauvais réflexes...dsl le ferai plus! :ange:
 
this->getLength() ne fait que renvoyer la valeur d'une variable que je ne modifie que lors de la lecture de mon image...
 

Citation :

cette appli n'est là que pour quelques tests, commenter la rigueur/propreté du code n'est donc pas nécéssaire, merci...;)

:ange:

Reply

Marsh Posté le 28-04-2003 à 16:30:36    

affiche this->getSize()
assure toi que tab n'est pas null
 
aussi affiche this->getLength() dans ta boucle for i (pour controle)

Reply

Marsh Posté le 28-04-2003 à 16:32:50    

chrisbk a écrit :


 
Nan :D
new/delete
malloc/free
 
(pis que tu fais du malloc en C++ ?skan meme plus pratique le new )
 
 


rahhhhhhhh v aller me flageller avec des orties... :cry:  
J'ai jamais utilisé les new que sur des classes que j'avais définies moi-même...c'est un truc de ce genre que je dois mettre à la place avant qu'un autre ne me fasse la remarque? :

Code :
  1. int * tab = new int[this->getSize()];

Reply

Marsh Posté le 28-04-2003 à 16:39:34    

Plus la peine de répondre, j'ai trouvé...
Comme un gros boulet que je suis, j'ai oublié le int
dans mon

Code :
  1. for(int l=0; l<9; l++)


Et l est aussi le nom de la variable membre designant la longueur...
Merci quand même à tous!


Message édité par skeye le 28-04-2003 à 16:41:27
Reply

Marsh Posté le 28-04-2003 à 16:41:04    

skeye a écrit :

Plus la peine de répondre, j'ai trouvé...
Comme un gros boulet que je suis, j'ai oublié le

Code :
  1. int


dans mon for(l=0; l<9; l++)
Et l est aussi le nom de la variable membre designant la longueur...
Merci quand même à tous!


 
jeune homme, vous aurez appris de cette experience l'interet de differencier variable membre de variable locale par un quelconque moyen syntaxique :D

Reply

Marsh Posté le 28-04-2003 à 16:41:04   

Reply

Marsh Posté le 28-04-2003 à 16:42:07    

vive g++ et son -Wshadow

Reply

Marsh Posté le 28-04-2003 à 16:42:50    

chrisbk a écrit :


 
jeune homme, vous aurez appris de cette experience l'interet de differencier variable membre de variable locale par un quelconque moyen syntaxique :D
 


tootafé...Je cours de ce pas rajouter "m_" devant tous mes noms de variables membres! :ange:

Reply

Marsh Posté le 28-04-2003 à 18:34:03    

chrisbk a *crit :


 
jeune homme, vous aurez appris de cette experience l'interet de differencier variable membre de variable locale par un quelconque moyen syntaxique :D
 


 
Je prefere la methode de Python : acceder a toutes les donnes membres en passant pas (*this)
 
Mais bon, je peux comprendre que ca en rebute certains aussi :D

Reply

Marsh Posté le 28-04-2003 à 19:11:42    

Kristoph a écrit :


 
Je prefere la methode de Python : acceder a toutes les donnes membres en passant pas (*this)
 
Mais bon, je peux comprendre que ca en rebute certains aussi :D
 


Bah vi mais C++ il comprend même si on le  met pas le this...et c'est ca qui m'a fait perdre un peu de temps cet aprem'!

Reply

Marsh Posté le 29-04-2003 à 14:37:56    

skeye a écrit :

Code :
  1. int * tab = new int[this->getSize()];




C'est juste ca non?
Parce-que j'aimerais savoir ce qui pourrait causer une segfault lors du delete d'une telle variable...  

Reply

Marsh Posté le 29-04-2003 à 14:40:21    

skeye a écrit :


C'est juste ca non?
Parce-que j'aimerais savoir ce qui pourrait causer une segfault lors du delete d'une telle variable...  


 
en quoi ca pourrait etre faux ?

Reply

Marsh Posté le 29-04-2003 à 14:51:42    

chrisbk a écrit :


 
en quoi ca pourrait etre faux ?


J'en sais rien, je suis juste trop habitué au C et aux malloc (pas taper!), ca me fait bizarre le new pour un int*...
Bon, c'est déjà ca, si c'est correct, mais ca me dit pas pourquoi je me retrouve avec un segfault lorsque je delete mon tab...!
La fonction donne à peu près ca:

Code :
  1. void
  2. CImage::rotation(int angle)
  3. {
  4. int * tmp = new int[this->getSize()];
  5.  
  6.   //Recopie temporaire du tableau
  7.   for(int i=0;i<this->getSize();i++)
  8.     tmp[i]=this->getVal(i);
  9.  
  10.   switch(angle)
  11.     {
  12.     case 90: //val[i, j] = val[j, i]
  13.       {
  14. //code utilisant tmp
  15. break;
  16.       }
  17.     case 180: //val[i] = val[size - i];
  18.       {
  19. //code utilisant tmp
  20. break;
  21.       }
  22.     case 270: //val[i,j] = val[j, size - i]
  23.       {
  24. //code utilisant tmp
  25. break;     
  26.       }
  27.     default:
  28.       return;
  29.     }
  30.   delete tmp;
  31. }


Après un passage dans le case 90, segmentation fault.
Si je commente le delete tmp; tout se passe bien...
Comprends pas... :??:

Reply

Marsh Posté le 29-04-2003 à 14:53:35    

attention jeune homme :D
 
allocation d'un tableau :
new [..]
 
liberation d'un tableau :
delete []tableau;

Reply

Marsh Posté le 29-04-2003 à 14:58:54    

chrisbk a écrit :

attention jeune homme :D
 
allocation d'un tableau :
new [..]
 
liberation d'un tableau :
delete []tableau;
 


ahhhhhhhhhhhhhhhhhh!
Voilà p-e l'erreur (c'est bizarre que ca me donne ce résultat qu'ici, je l'ai fait au moins 10 fois...:lol:)

Reply

Marsh Posté le 29-04-2003 à 15:03:08    

on va pas quoter, mais ça mériterait

Reply

Marsh Posté le 29-04-2003 à 15:03:34    

Bon, ca me fait quelques erreurs de corrigées (:jap:), mais ca ne résoud pas le pb...les symptomes sont les mêmes!

Reply

Marsh Posté le 29-04-2003 à 15:04:23    

++Taz a écrit :

on va pas quoter, mais ça mériterait


Hésite pas...je reconnais être un gros boulet qd je m'y mets... :sweat:

Reply

Marsh Posté le 29-04-2003 à 15:48:45    

Bon, ya du nouveau...après 2/3 tests, un make clean et une recompil, le segfault intervient maintenant même si je commente le delete.
Par contre je comprends toujours pas la cause du bug!
Dans le case 90 juste avant le break j'ai mis un cout, qui s'affiche.
Il devrait donc sortir de la fonction sans problème...
Mais j'ai aussi miss un cout dans la fonction appelante, juste après l'appel...et celui-ci n'apparait pas!
Je commence à :pt1cable: , d'autant plus que c'est probablement une connerie, comme d'habitude avec moi...
 
[edit]
Ca y est, je suis fou:
J'ai viré tout ce qu'il pouvait se passer après la fonction à-part les cout => plante tjrs.
J'ai alors viré le delete => plante plus
J'ai tout remis sauf le delete => le cout de la fonction appelante apparait, mais ca crashe qd meme... :fou:  :pt1cable:  :??:


Message édité par skeye le 29-04-2003 à 16:07:45
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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