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

  FORUM HardWare.fr
  Programmation
  C++

  PB poilu de stack overflow C++

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

PB poilu de stack overflow C++

n°571101
toufleboss
Posté le 19-11-2003 à 21:27:24  profilanswer
 

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

mood
Publicité
Posté le 19-11-2003 à 21:27:24  profilanswer
 

n°571102
chrisbk
-
Posté le 19-11-2003 à 21:28:40  profilanswer
 

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

n°571105
Taz
bisounours-codeur
Posté le 19-11-2003 à 21:31:09  profilanswer
 

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 ?

n°571126
kaa
Posté le 19-11-2003 à 22:23:33  profilanswer
 

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.

n°571131
nraynaud
lol
Posté le 19-11-2003 à 22:32:31  profilanswer
 

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
n°571134
Kristoph
Posté le 19-11-2003 à 22:52:36  profilanswer
 

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
n°571135
kaa
Posté le 19-11-2003 à 22:56:56  profilanswer
 

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

n°571138
nraynaud
lol
Posté le 19-11-2003 à 23:01:01  profilanswer
 

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
n°571234
toufleboss
Posté le 20-11-2003 à 02:15:01  profilanswer
 

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

n°571235
Taz
bisounours-codeur
Posté le 20-11-2003 à 02:16:23  profilanswer
 

ç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
mood
Publicité
Posté le 20-11-2003 à 02:16:23  profilanswer
 

n°571237
toufleboss
Posté le 20-11-2003 à 02:22:12  profilanswer
 

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

n°571238
toufleboss
Posté le 20-11-2003 à 02:23:44  profilanswer
 

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.

n°571240
Taz
bisounours-codeur
Posté le 20-11-2003 à 02:36:06  profilanswer
 

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

n°571242
matafan
Posté le 20-11-2003 à 03:16:24  profilanswer
 

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.

n°571449
nraynaud
lol
Posté le 20-11-2003 à 12:06:15  profilanswer
 

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
n°571451
Taz
bisounours-codeur
Posté le 20-11-2003 à 12:07:30  profilanswer
 

nraynaud a écrit :

[c'est l'algo du peintre

bien vu, je l'avais pas reconnu


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

  PB poilu de stack overflow C++

 

Sujets relatifs
Pb CSS overflow:auto avec netscape 7[Sql] Buffer overflow
overflow + marges fixesOverflow et roulette de souris ?
[HTML/CSS] IE et overflow?exception_flt_stack_check
[C] stack overflow a la premiere lignebalise <div> : overflow:auto
[ Besoin du test de mon HTML ] Div avec overflow, quels navigateurs ? 
Plus de sujets relatifs à : PB poilu de stack overflow C++


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)