Вниз
Скачать: CL | DM;

Странная рекурсия...   Найти похожие ветки 

← →
Ricks ©   (2007-08-10 18:17) [0]

Стоит задача заполнить некоторое поле TField

TField = array [1..200, 1..320] of byte;

ячейки которого могут принимать значения

const
FL_EMPTY = 0;
FL_LINE  = 1;
FL_FILL  = 2;
FL_CLINE = 3;
FL_DOT   = 4;

Процедура заполнения выглядит так:
procedure TMainForm.FillSquare(var F:TField; x, y : integer; var Counter:Cardinal; Count:Boolean);
begin
if (F[y, x] <> FL_EMPTY) or (x < 1) or (y < 1) or (x > 320) or (y > 200) then exit;

Inc(Counter);
F[y, x]:=FL_FILL;

if F[y - 1, x - 1] = FL_EMPTY then FillSquare( F, x - 1, y - 1, Counter, Count );
if F[y - 1,     x] = FL_EMPTY then FillSquare( F,     x, y - 1, Counter, Count );
if F[y - 1, x + 1] = FL_EMPTY then FillSquare( F, x + 1, y - 1, Counter, Count );
if F[    y, x - 1] = FL_EMPTY then FillSquare( F, x - 1,     y, Counter, Count );
if F[    y, x + 1] = FL_EMPTY then FillSquare( F, x + 1,     y, Counter, Count );
if F[y + 1, x - 1] = FL_EMPTY then FillSquare( F, x - 1, y + 1, Counter, Count );
if F[y + 1,     x] = FL_EMPTY then FillSquare( F,     x, y + 1, Counter, Count );
if F[y + 1, x + 1] = FL_EMPTY then FillSquare( F, x + 1, y + 1, Counter, Count );
end;

но, к сожалению она приводит к Stack overflow. Почему?


← →
Efir ©   (2007-08-10 18:40) [1]

Потому что стек не бесконечен.


← →
Ricks ©   (2007-08-10 18:47) [2]

Просто увеличить его?


← →
Efir ©   (2007-08-10 19:32) [3]

Здесь явно стека не хватит, слишком много вызовов функции. Даже если бы алгоритм бал четырёхсвязным, всё рано не хватило бы. Советую использовать другой алгоритм. Лучше испоьзовать динамический массив.


← →
Loginov Dmitry ©   (2007-08-10 20:41) [4]

Попробуй убрать из объявления метода
var F:TField,
var Counter:Cardinal
Count:Boolean

т.е. сделай их глобальными.

И перепиши FillSquare как обычную процедуру, а не метод.
Тогда стека скорее всего хватит.

А по хорошему, раз такие числа, то нужно или стек увеличивать, или алгоритм менять.


← →
Ricks ©   (2007-08-11 15:54) [5]

Увеличил стек и все стало нормально работать. Спасибо


← →
Вася Правильный   (2007-08-11 18:33) [6]


> Увеличил стек и все стало нормально работать

до поры до времени


← →
Anatoly Podgoretsky ©   (2007-08-11 18:35) [7]

> Вася Правильный  (11.08.2007 18:33:06)  [6]

Отрубая хвост по кусочкам.


← →
Ricks ©   (2007-08-12 18:37) [8]


> до поры до времени

нет, больше и не требуется. у меня все размеры строго ограничены



Страницы: 1 вся ветка

Скачать: CL | DM;



Память: 0.46 MB
Время: -0.989 c
1-1186031887
Раф
2007-08-02 09:18
2007.10.28
Как в чужом приложение на MessageDlg нажать Да


9-1161872789
GOS
2006-10-26 18:26
2007.10.28
GLScene DCE


2-1191494747
Pacific
2007-10-04 14:45
2007.10.28
коннект к поп3


6-1172807693
ACSBaks
2007-03-02 06:54
2007.10.28
Как получить IP адрес на компоненте TIdHTTPServer


10-1138808974
kutnul
2006-02-01 18:49
2007.10.28
Создание обработчика событий




   Наверх