![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Странная рекурсия... [D7, WinXP]
Ricks © (2007-08-10 18:17:00)Стоит задача заполнить некоторое поле 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. Почему?
Ricks (2007-08-12 18:37:00) [1]
> до поры до времени
нет, больше и не требуется. у меня все размеры строго ограничены
Anatoly Podgoretsky (2007-08-11 18:35:00) [2]> Вася Правильный (11.08.2007 18:33:06) [6]
Отрубая хвост по кусочкам.
Вася Правильный (2007-08-11 18:33:00) [3]
> Увеличил стек и все стало нормально работать
до поры до времени
Ricks (2007-08-11 15:54:00) [4]Увеличил стек и все стало нормально работать. Спасибо
Loginov Dmitry (2007-08-10 20:41:00) [5]Попробуй убрать из объявления метода
var F:TField,
var Counter:Cardinal
Count:Boolean
т.е. сделай их глобальными.
И перепиши FillSquare как обычную процедуру, а не метод.
Тогда стека скорее всего хватит.
А по хорошему, раз такие числа, то нужно или стек увеличивать, или алгоритм менять.
Efir (2007-08-10 19:32:00) [6]Здесь явно стека не хватит, слишком много вызовов функции. Даже если бы алгоритм бал четырёхсвязным, всё рано не хватило бы. Советую использовать другой алгоритм. Лучше испоьзовать динамический массив.
Ricks (2007-08-10 18:47:00) [7]Просто увеличить его?
Efir (2007-08-10 18:40:00) [8]Потому что стек не бесконечен.