Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Странная рекурсия... [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]

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо