PDA

Tam Sürümünü Görmek İçin : bu recursive kod neden bilgisayarı kilitliyo


porsuk
11/07/2005, 13:05
Arkadaşlar (x,y) 10 ile 100 ile sınırlı bir şekil ve onun içini pixel pixel
boyamak istiorum (C BUILDER) bu kod bilgisayarı kilitlediği gibi CTRL ALT DEL ile
de kurtulmana izin vermio.programda fonksiyonu boundaryFill(50,50) olarak
çağırıyorum.

Nedenini ve kodun doğru şeklini bulmama yardımcı olurmusunuz.Cevaplarınız için şimdiden teşekkürler...

void boundaryFill(int x, int y)
{
if ((x < 10) || (x >= 100)) return;
if ((y < 10) || (y >= 100)) return;

Form1->Canvas->Pixels[x][y]=clRed;

boundaryFill(x+1,y);
boundaryFill(x,y+1);
boundaryFill(x-1,y);
boundaryFill(x,y-1);

}


acemi
11/07/2005, 13:57
Gectigi yerleri tekrar tekrar boyar. İşlem yaptığı bölüme dönmemesini sağlayan birşey yazmamışsın

mr1yh1
11/07/2005, 18:51
#include <iostream>
using namespace std;
void boundaryFill(int x);
int Pixels[3];
int main()
{
boundaryFill(1);
}
void boundaryFill(int x)
{
if ((x <= 0) || (x >= 3)) return;
Pixels[x]=-1;
boundaryFill(x+1);
boundaryFill(x-1);
}

senin kodu basitleştirdim, çok ilginç bir kısır döngü bu..
sonuçta stack taşması yapıyor.. yukarıdaki fonksiyon f olsun, 1 ile çağrıldı sonra 2 ile diğerini çağırdı..

f(1)-->f(2)-->f(3)
..........f(3)*( dikkat burada geri dönüş yok x-1 çalıştı..)
..........f(2)-->f(3)
..........f(1)-->f(2)-->f(3)
....................f(3)*
....................f(2)-->f(3)
....................f(1)-->f(2)-->f(3)
..............................f(3)*
..............................f(2)-->f(3)
..............................f(1)-->f(2)-->f(3)
........................................f(3)*
........................................f(2)-->f(3)
böylece gider, ta ki stack ta yeni değişken için yer kalmayana kadar...