PB poilu de stack overflow C++

PB poilu de stack overflow C++ - C++ - Programmation

Marsh Posté le 19-11-2003 à 21:27:24    

Ci joint un algo de détourage d'un bmp de qq lignes :
 
Le Binze c'est que des que la zone a détourée est trop importante je me tape un Stack overflow (le nb de fonction récursive empilé est trop important).
 
Cependant j'ai augmenté la taille de la pile à 1Go est à l'execution le programme plante (sur de grosses zones) alors que la mémoire utilisée est de 9-10 Mo.
 
Comprend pas.
 
void CPicture::Def4Connexes(unsigned long offset_pixel,const int & largeur,const int & hauteur)
{
 
BufferDetour[offset_pixel] = 1;
int y = offset_pixel/largeur;
int x = offset_pixel%largeur;
long off = offset_pixel;
//int nb_voisins = 0;
float seuil = 0.8;
 
for(int i=0;i<4;i++)
{
   switch(i){
   case 0:
    off = offset_pixel + 1;//droit
    break;
   case 1:
    off = offset_pixel + largeur;//bas
    break;
   case 2:
    off = offset_pixel -1;//gauche
    break;
   case 3:
    off = offset_pixel - largeur;//haut
    break;
   }
   
  if( ((x-1)>=0) && ((x+1)<largeur) && ((y+1)<hauteur) && ((y-1)>=0) ){
   if( (BufferDetour[off] == 0) && (SimilariteCouleur(bmpBuffer[off]) > seuil)){
  //  nb_voisins++;
    Def4Connexes(off,largeur,hauteur);
   }
  }  
}
  //if(nb_voisins != 4) TabResul[indiceConn++] = offset_pixel; //mise anjour du tableau des contours  
}
 
Zen [B)]

Reply

Marsh Posté le 19-11-2003 à 21:27:24   

Reply

Marsh Posté le 19-11-2003 à 21:28:40    

ben t'overflow quoi :o
fais ca autrement qu'en recursif

Reply

Marsh Posté le 19-11-2003 à 21:31:09    

quel compilateur ?
t'as pas moyen de réduire le nombre de variables locales ?
(x-1)>=0 -> x>=1
 
combien de profondeut d'appel récursif ? t'es sur que ça s'arrete ?
 
récursivité terminale ?

Reply

Marsh Posté le 19-11-2003 à 22:23:33    

Ton code ne marche pas, en fait tu boucles.
 
1er  appel D4C(op0, l, h) i=0 ->
2eme appel D4C(op0 +1, l, h) i =2 ->
xeme appel D4C(op0 +1 -1, l, h)
et puisque tu n'a pas d'effet de bords, c'est ==1er appel.
 
Sinon, tu peux sortir ton if ((x-1 blabla y)) du for(..).
Tu pourras p-e t'en sortir en traitant d'abord tous les cas gauche, puis bas, puis ... si l'algo le permet.

Reply

Marsh Posté le 19-11-2003 à 22:32:31    

kaa a écrit :


xeme appel D4C(op0 +1 -1, l, h)
et puisque tu n'a pas d'effet de bords, c'est ==1er appel.


première ligne :

Code :
  1. BufferDetour[offset_pixel] = 1;


condition de récursivité :

Code :
  1. if( (BufferDetour[off] == 0) && (SimilariteCouleur(bmpBuffer[off]) > seuil)){
  2. //  nb_voisins++;
  3.    Def4Connexes(off,largeur,hauteur);
  4.   }


 
 
ceci dit j'ai rien pour l'aider, trop la flemme de tailler dans le spaguetti


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 19-11-2003 à 22:52:36    

Pour commencer, utilise les balises cpp pour délimiter le code, c'est beaucoup plus lisible
 

Code :
  1. void CPicture:Def4Connexes(unsigned long offset_pixel,const int & largeur,const int & hauteur)
  2. {
  3. BufferDetour[offset_pixel] = 1;
  4. int y = offset_pixel/largeur;
  5. int x = offset_pixel%largeur;
  6. long off = offset_pixel;
  7. //int nb_voisins = 0;
  8. float seuil = 0.8;
  9. for(int i=0;i<4;i++)
  10. {
  11.    switch(i){
  12.    case 0:
  13.     off = offset_pixel + 1;//droit
  14.     break;
  15.    case 1:
  16.     off = offset_pixel + largeur;//bas
  17.     break;
  18.    case 2:
  19.     off = offset_pixel -1;//gauche
  20.     break;
  21.    case 3:
  22.     off = offset_pixel - largeur;//haut
  23.     break;
  24.    }
  25.  
  26.   if( ((x-1)>=0) && ((x+1)<largeur) && ((y+1)<hauteur) && ((y-1)>=0) ){
  27.    if( (BufferDetour[off] == 0) && (SimilariteCouleur(bmpBuffer[off]) > seuil)){
  28.   //  nb_voisins++;
  29.     Def4Connexes(off,largeur,hauteur);
  30.    }
  31.   } 
  32. }
  33.   //if(nb_voisins != 4) TabResul[indiceConn++] = offset_pixel; //mise anjour du tableau des contours   
  34. }


 
Ensuite, rapidement :
 
Pourquoi passer largeur et hauteur par const & ? Disons le, c'est assez ridicule dans ce cas. Passe les par recopie simplement.
 
Pourquoi recopier la variable "offset_pixel" dans la variable "off" ? Aucun interet ici tant que les commentaires restent à leur place.
 
Et pour finir, je prédis un depacement de capacité dans le tableau TabResul :whistle: Solution recomandée : utiliser un std::vector<long> au lieu de ce que je suppose être un "long [trop_petit_de_toute_facon]" Et utiliser la methode push_back() pour ajouter un element à la fin du tableau.


Message édité par Kristoph le 19-11-2003 à 22:53:56
Reply

Marsh Posté le 19-11-2003 à 22:56:56    

^^ a ouais, l'avais pas vu. Desole leboss.

Reply

Marsh Posté le 19-11-2003 à 23:01:01    

j'ai quand même globalement un gros doute sur l'intérêt de la récursivité quand tout passe pas effet de bord.
T'as pas envie de sortir une pile explicite ?


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 20-11-2003 à 02:15:01    

C'est bien cool tout vos messages, je vois que certains maitrise le sujet.
Alors petites informations :
- En itératif cela est d'une lenteur imparable (donc a exclure)
- J'ai vu un algo du même genre tourner surper bien.
- Mon programme n'utilise meme pas 6Mo ram

Reply

Marsh Posté le 20-11-2003 à 02:16:23    

ça veut dire quoi d'une lenteur imparable ? ton programme est facilement transformable
 
mais je penche encore pour un problème de point fixe : ta condition d'arret n'est peut etre jamais atteinte ? tu nous as toujours pas dit à quelle profondeut de récursion du travailles


Message édité par Taz le 20-11-2003 à 02:17:24
Reply

Marsh Posté le 20-11-2003 à 02:16:23   

Reply

Marsh Posté le 20-11-2003 à 02:22:12    

Taz a écrit :

quel compilateur ?
t'as pas moyen de réduire le nombre de variables locales ?
(x-1)>=0 -> x>=1
 
combien de profondeut d'appel récursif ? t'es sur que ça s'arrete ?
 
récursivité terminale ?


 
Je te dis que ça fonctionne sur des zones à détourer petites. L'algo est bon. Le Pb c'est l'overflow non justifié.

Reply

Marsh Posté le 20-11-2003 à 02:23:44    

Taz a écrit :

ça veut dire quoi d'une lenteur imparable ? ton programme est facilement transformable
 
mais je penche encore pour un problème de point fixe : ta condition d'arret n'est peut etre jamais atteinte ? tu nous as toujours pas dit à quelle profondeut de récursion du travailles  


 
La condition d'arret est atteinte puisque cela fonctionne sur de petites zones.
 
En termes de profondeur, c'est facile si la zone contient n pixels on une prfondeur de n.

Reply

Marsh Posté le 20-11-2003 à 02:36:06    

ben passe en itératif bordel
on y peut quoi si ton compilo est pas capable de bien faire l'optimisation ...
 
passe en itératif, c très facile dans ton cas

Reply

Marsh Posté le 20-11-2003 à 03:16:24    

Puis si l'iteratif est lent, c'est que tu t'y prend mal. Y'à toujours moyen de faire plus rapide en iteratif qu'en récursif.

Reply

Marsh Posté le 20-11-2003 à 12:06:15    

Taz a écrit :


passe en itératif, c très facile dans ton cas

[+1]
ayé, je viens de reconnaitre l'algo, c'est l'algo du peintre, et je l'avais fait en récursif sans pb, pour faire de la segmentation temps-réel sur de la vidéo. Et mes seul problèmes de perfs étaient la vitesse d'acquisition de la caméra et l'algo de relaxation des étiquettes dont la complexité n'était pas bornée.


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 20-11-2003 à 12:07:30    

nraynaud a écrit :

[c'est l'algo du peintre

bien vu, je l'avais pas reconnu

Reply

Sujets relatifs:

Leave a Replay

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