| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 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 начал.... Просто не думал, что это проблему со стеком решит....
а как расчитать сколько места надо? неужели кол-во памяти на 1 элемент(ориентир на тип)*кол-во элементов? SetLenght сама не расчитывает это дело? |
| Автор: <Spawn> 31.3.2004, 11:31 | ||
Все можно сделать с помощью SetLength. Вот простой пример:
|
| Автор: Jey_k 31.3.2004, 11:42 | ||
| Maverick Приведу пример с записью файла в массив, так понятней будет
|
| Автор: 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 да не за что в общем. Обращайся |
| Автор: p0s0l 1.4.2004, 09:01 | ||
А где оффтоп ? Выражение благодарности - это не оффтоп. Наоборот, желательная часть завершения темы. |