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

  FORUM HardWare.fr
  Programmation
  C++

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°374736
skeye
Posté le 28-04-2003 à 16:13:42  profilanswer
 

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...;)

mood
Publicité
Posté le 28-04-2003 à 16:13:42  profilanswer
 

n°374751
chrisbk
-
Posté le 28-04-2003 à 16:17:20  profilanswer
 

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

n°374764
skeye
Posté le 28-04-2003 à 16:20:17  profilanswer
 

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!

n°374767
Taz
bisounours-codeur
Posté le 28-04-2003 à 16:21:04  profilanswer
 

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

n°374772
chrisbk
-
Posté le 28-04-2003 à 16:21:53  profilanswer
 

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 )
 

n°374795
skeye
Posté le 28-04-2003 à 16:28:45  profilanswer
 

++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:

n°374804
Deaddy
Posté le 28-04-2003 à 16:30:36  profilanswer
 

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

n°374813
skeye
Posté le 28-04-2003 à 16:32:50  profilanswer
 

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()];

n°374829
skeye
Posté le 28-04-2003 à 16:39:34  profilanswer
 

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
n°374831
chrisbk
-
Posté le 28-04-2003 à 16:41:04  profilanswer
 

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

mood
Publicité
Posté le 28-04-2003 à 16:41:04  profilanswer
 

n°374834
Taz
bisounours-codeur
Posté le 28-04-2003 à 16:42:07  profilanswer
 

vive g++ et son -Wshadow

n°374836
skeye
Posté le 28-04-2003 à 16:42:50  profilanswer
 

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:

n°375010
Kristoph
Posté le 28-04-2003 à 18:34:03  profilanswer
 

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

n°375027
skeye
Posté le 28-04-2003 à 19:11:42  profilanswer
 

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'!

n°376149
skeye
Posté le 29-04-2003 à 14:37:56  profilanswer
 

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

n°376160
chrisbk
-
Posté le 29-04-2003 à 14:40:21  profilanswer
 

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 ?

n°376206
skeye
Posté le 29-04-2003 à 14:51:42  profilanswer
 

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... :??:

n°376217
chrisbk
-
Posté le 29-04-2003 à 14:53:35  profilanswer
 

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

n°376241
skeye
Posté le 29-04-2003 à 14:58:54  profilanswer
 

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:)

n°376263
Taz
bisounours-codeur
Posté le 29-04-2003 à 15:03:08  profilanswer
 

on va pas quoter, mais ça mériterait

n°376266
skeye
Posté le 29-04-2003 à 15:03:34  profilanswer
 

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

n°376272
skeye
Posté le 29-04-2003 à 15:04:23  profilanswer
 

++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:

n°376448
skeye
Posté le 29-04-2003 à 15:48:45  profilanswer
 

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
mood
Publicité
Posté le   profilanswer
 


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

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

 

Sujets relatifs
boucle while indentifiant variable[Socket Linux] Qd le client ferme, le serveur boucle sur le message
[PHP] petit probleme avec boucle[PHP] Afficher dans boucle les caract de 3 objets de même type ...
Boucle While - printf - scanf - fflush[C] Problème de getc dans une boucle
Boucle + Zone de texte = Help me !![VBA] interuption de traitement dans une boucle ...
[JS] Cocher une checkbox générée à partir d'une boucle PHP (réparé)[C] contrôle if dans une boucle ... ?
Plus de sujets relatifs à : [C++] Pb de boucle for récalcitrante


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