Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.10.28;
Скачать: 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 вся ветка

Текущий архив: 2007.10.28;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.014 c
2-1191236054
sydenis
2007-10-01 14:54
2007.10.28
неявное связывание с bpl


15-1191598424
Nikfel
2007-10-05 19:33
2007.10.28
DVD-Recoder.


15-1191303419
de.
2007-10-02 09:36
2007.10.28
8 - |


2-1191912772
Scarllett
2007-10-09 10:52
2007.10.28
? OnClick event для страницы в MS EI


2-1191763245
bagos
2007-10-07 17:20
2007.10.28
окна