Fonction récursive

khabdou Messages postés 12 Date d'inscription vendredi 31 août 2007 Statut Membre Dernière intervention 4 mai 2008 - 3 mai 2008 à 00:23
khabdou Messages postés 12 Date d'inscription vendredi 31 août 2007 Statut Membre Dernière intervention 4 mai 2008 - 4 mai 2008 à 23:33
Salut,
j'ai un problem au cours de l'execution du code développer avec VS2005(enoncé aprés) il se lance une exception de type "System.StackOverflowException"   SVP est ce qu'il y a quelqu'un peut m'aider pour résoudre se probléme et comment le résoudre?
Merci d'avance............

private






void
baguette(

Bitmap
image,

int
x,

int
y,

Double
couleur)
{


 Double
variance = 0.7;


Double
coul = couleur;


Double
var = 0;


/////////////////////////////////////////////////////////////////////////////






Double
droite RvbToDecimal(image.GetPixel(x + 1, y).R, image.GetPixel(x + 1, y).G, image.GetPixel(x + 1, y).B);var droite * variance;


if
(coul < (droite + var) && coul > (droite - var) && x < image.Width && tab[x + 1, y] ==

false
){

tab[x + 1, y] =


true
;baguette(image, x + 1, y, coul);

}


//////////////////////////////////////////////////////////////////////////////






Double
 gauche RvbToDecimal(image.GetPixel(x - 1, y).R, image.GetPixel(x - 1, y).G, image.GetPixel(x - 1, y).B);var gauche * variance;


if
(coul < (gauche + var) && coul > (gauche - var) && x > 0 && tab[x - 1, y] ==

false
){

tab[x - 1, y] =


true
;baguette(image, x - 1, y, coul);

}


///////////////////////////////////////////////////////////////////////////






Double
dessous RvbToDecimal(image.GetPixel(x, y + 1).R, image.GetPixel(x, y + 1).G, image.GetPixel(x, y + 1).B);var dessous * variance;


if
(coul < (dessous + var) && coul > (dessous - var) && tab[x, y + 1] ==

false
&& y < image.Height){

tab[x, y + 1] =


true
;baguette(image, x, y + 1, coul);

}


/////////////////////////////////////////////////////////////////////////////////






Double
dessus RvbToDecimal(image.GetPixel(x, y - 1).R, image.GetPixel(x, y - 1).G, image.GetPixel(x, y - 1).B);var dessus * variance;


if
(coul < (dessus + var) && coul > (dessus - var) && tab[x, y - 1] ==

false
&& y > 0){

tab[x, y - 1] =


true
;baguette(image, x, y - 1, coul);

}

}

4 réponses

Nikoui Messages postés 794 Date d'inscription vendredi 24 septembre 2004 Statut Membre Dernière intervention 19 août 2008 13
3 mai 2008 à 01:21
Je n'ai pas regardé ton code en détail, mais a chaque appel de ta fonction, tu sembles rapeller recursivement cette même fonction 4 fois de suite... autrement dit, si tu fais cela a chaque fois, le nombre d'appel récursif explose littéralement... Es tu sur que c'est la bonne solution ? Es tu sur aussi que tu "sorts" de ta récursivité de temps en temps ?

<hr size="2" width="100%" />
Working as designed
www.nikoui.fr
0
khabdou Messages postés 12 Date d'inscription vendredi 31 août 2007 Statut Membre Dernière intervention 4 mai 2008
3 mai 2008 à 02:11
salut,
oui je suis sur qu'elle sort de lla récursivité,
ce code (baguette) c'est presque un code d'une baguette magique de PaintDotNet oubien Photoshop.
0
Nikoui Messages postés 794 Date d'inscription vendredi 24 septembre 2004 Statut Membre Dernière intervention 19 août 2008 13
3 mai 2008 à 10:42
C'est surement le "presque" qui pose problème alors... De ce que je comprend, a chaque appel, tu va re-rentrer 4 fois dans ta méthode (ce qui veut donc dire, que tu va donc rappeler 16 fois la méthode, puis 64 fois, 256 fois, etc). Et tu passes à chaque fois un certain nombre de paramètres donc ca ne m'étonnes pas que la pile mémoire explose : Y'a une différence entre faire une boucle de 256 itérations et faire une récursivité sur 256 niveaux : à chaque appel récursif tu va sauvegarder le contexte courant, les paramètres, l'adresse de retour... Et tout ça pour traiter uniquement les 256 pixels autour de ton point initial, autrement dit un carré de 16*16 pixel -> je te laisse imaginer ce que ça donne sur une portion d'image a peine plus grande.

Je persiste donc à dire que ce n'est pas la bonne solution dans ton cas... Soit modifie ta fonction pour qu'elle ne prenne plus de paramètres, ça sera toujours ça de gagner sur la pile mémoire et ça passera peut être mieu, soit ne fait pas de la récursivité mais de simples boucles while...

<hr size="2" width="100%" />
Working as designed
www.nikoui.fr
0
khabdou Messages postés 12 Date d'inscription vendredi 31 août 2007 Statut Membre Dernière intervention 4 mai 2008
4 mai 2008 à 23:33
Merci,mais j'ai pas trouvé l'idée comment remplacer la fct récursive par une boucle while.
Si tu as une idée,svp aidez moi pr résoudre se problém.
Merci d'avance.........
0
Rejoignez-nous