Форум: "Основная";
Текущий архив: 2007.10.28;
Скачать: [xml.tar.bz2];
ВнизСтранная рекурсия... Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.04 c