Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > В чем ошибка?


Автор: МММ 26.12.2002, 11:25
Код

procedure TForm1.Button1Click(Sender: TObject);
begin
form1.Canvas.Brush.Color:=clwhite;
form1.Canvas.Pen.Color:=clblack;
form1.Canvas.Rectangle(40,40,60,60);
paint(50,50);
end;

Procedure TForm1.paint(x,y:integer);
Begin
If form1.Canvas.Pixels[x,y]<>clblack then
begin
  form1.Canvas.Pixels[x,y]:=clred;
  paint(x+1,y);
  paint(x-1,y);
  paint(x,y+1);
  paint(x,y-1);
end;
end;


Во первых не закрашивает, а во вторых выдает ошибку StackOverflow ? :notify

Автор: Vit 26.12.2002, 13:47
Цитата
выдает ошибку StackOverflow ? :notify

StackOverflow - обычно если рекурсия "не выходит" т.е. программа зацикливается полностью. Пересмотрите условия выхода из рекурсии, я к коду не приглядывался но похоже что процедура вызывает саму себя с такими же параметрами.

Иногда StackOverflow возникает при очень большой глубине и массивных процедурах выхова (здесь это похоже не этот случай). Дело в том что рекурсия очень опасная штука - на этапе компиляции компилятор абсолютно не знает глубину вызова, но от него требуется зарезервировать память для стека, поэтому возможен вариант когда стека не хватает. В опциях линкера есть размеры стека и их можно изменить чтобы он рекурсия "влазела", но если вызов "зациклился" то это естественно не поможет

Автор: МММ 26.12.2002, 15:56
все разобрался!!!!!!
вот так надо
Код

If (form1.Canvas.Pixels[x,y]<>clblack) and (form1.Canvas.Pixels[x,y]<>clred) then

Автор: Step 26.12.2002, 18:59
вообще надо помнить что при рекурсии надо очень четко определять процес выхода.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)