Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Переполнение стека при вызове функции


Автор: Maverick 31.3.2004, 09:43
Здравствуйте....

Жуткая вещь... В проге использую функцию, производящую большой объем вычислений.... Для этого ей отправляется большой массив данных... array пока статический, в будущем будет динамический... Так вот до определенного размера, прдеположим 300х300, все работает нормально... Если увеличить размер массива, то все - переполнение стека... Черт, получилось, что при тестировании все работало, а как грузанул нормальные данные - все заело....
Может подскажет кто-нибудь.... Этот самый стек разве не должен бы свапиться на винт при нехватке памяти?... Его размер как-то можно увеличить? Или вообще, что можно предпринять?

Заранее благодарен....

Автор: oleg1973 31.3.2004, 10:39
стек тут не причем
нехватка памяти тоже
видимо ты своим массивом на сам стек залазиеш
либо передаеш с какойто функ мало или много параметров

Автор: Maverick 31.3.2004, 11:11
Ну как тебе сказать....
Предположим описываю статический массив размеров 300х300... Все отрабатывает прекрасно.... Стоит описать массив 305х305 - все, возникает ошибка переполнения стека.... причем в первой строке вызываемой функции.... прям на begin....
Осюда я сделал вывод, что вызывает эту ошибку размер массива при передаче....
Сам на стек я не лезу, незачем... Так и недостаток параметров тоже не проблема, другая ошибка была бы, да и функций перегружаемых нет....

Автор: Jey_k 31.3.2004, 11:16
Maverick

Поюзай динамический массив, перед его использованием, вызывают процедуру

GetMem(<имя массива>,<сколько места надо>);

Она решит твои проблемы с размерами стэка


З.Ы. Стандартный ехе-шник имеет фиксированный стэк, сейчас не помню уже сколько,
а своим статическим массивом (а не динамическим с дополнительным выделением памяти) ты его переполняешь.

Автор: Maverick 31.3.2004, 11:27
Ну я в принципе и планировал перейти на динамический массив... счас переделываю, потому что планировать планировал, а сам индексы массивов все с 1 начал....
Просто не думал, что это проблему со стеком решит....

Цитата
GetMem(<имя массива>,<сколько места надо>);


а как расчитать сколько места надо? неужели кол-во памяти на 1 элемент(ориентир на тип)*кол-во элементов?
SetLenght сама не расчитывает это дело?

Автор: <Spawn> 31.3.2004, 11:31
Все можно сделать с помощью SetLength. Вот простой пример:

Код
const
 ARR_LEN = 10;
var
 DynArr: array of integer;
 i: integer;
begin
 SetLength(DynArr, ARR_LEN);
 for i := 0 to ARR_LEN - 1 do
   DynArr[i] := i;
end;

Автор: Jey_k 31.3.2004, 11:42
Maverick
Приведу пример с записью файла в массив, так понятней будет

Код


type
Dyn_mas=array[1..1] of byte;
...
var
MyMas:^Dyn_mas;
i:integer;
f:file of byte;
begin
AssignFile(f,<path>);
Reset(f);
GetMem(MyMas,filesize(f)); //поскольку тип данных байтовый, то количество ни на что не умножаем.
На момент выделения памяти уже известно какого типа данные и в каком количестве размещаются в памяти

for i:=1 to filesize (f) do
 Read(f,MyMas^[i]);
.....
FreeMem(MyMas);//освобождаем выделенную память,если больше данные не нужны
end;

Автор: Maverick 31.3.2004, 12:03
Браво... все работает....
Огромное спасибо за хелп, ребята... А то я с утра чуть в обморок не упал....


Модератор, сорри за оффтоп.... Просто благодарность распирает....

Пойду пообедаю на радостях...


Автор: Jey_k 31.3.2004, 12:34
Maverick
чей пример заработал?

Автор: Maverick 31.3.2004, 12:49
Ну раньше я обрабатывал динамические массивы в стиле <Spawn>....
Поэтому применил SetLength... Чтоб долго не разбираться.... сроки-сроки... Да и под мою задачу больше подходит.
Просто пора бросить привычку писать на статических, а потом превращать их в динамические.... Я раньше так не обламывался, не было таких объемов...
Jey_k твой пример я тоже в архив зарыл.... на всякий случай....

Еще раз спасибо всем....

Автор: Jey_k 31.3.2004, 16:19
Maverick
да не за что в общем.
Обращайся
smile.gif

Автор: p0s0l 1.4.2004, 09:01
Цитата
Модератор, сорри за оффтоп

А где оффтоп ? Выражение благодарности - это не оффтоп. Наоборот, желательная часть завершения темы. smile.gif

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)