Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Переполнение стека при вызове функции, Как обойти? 
:(
    Опции темы
Maverick
  Дата 31.3.2004, 09:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1307
Регистрация: 22.9.2003
Где: Odessa, Ukraine

Репутация: 2
Всего: 10



Здравствуйте....

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

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


--------------------
smile
PM ICQ GTalk   Вверх
oleg1973
Дата 31.3.2004, 10:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


asm fanat
****


Профиль
Группа: Экс. модератор
Сообщений: 3283
Регистрация: 16.7.2003
Где: Italy

Репутация: 1
Всего: 34



стек тут не причем
нехватка памяти тоже
видимо ты своим массивом на сам стек залазиеш
либо передаеш с какойто функ мало или много параметров



--------------------
SST 465555
icq 200-512-712
PM MAIL WWW ICQ   Вверх
Maverick
Дата 31.3.2004, 11:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1307
Регистрация: 22.9.2003
Где: Odessa, Ukraine

Репутация: 2
Всего: 10



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


--------------------
smile
PM ICQ GTalk   Вверх
Jey_k
Дата 31.3.2004, 11:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


WEB-командир
****


Профиль
Группа: Комодератор
Сообщений: 4149
Регистрация: 16.11.2003
Где: Москва

Репутация: 1
Всего: 61



Maverick

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

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

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


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

Это сообщение отредактировал(а) Jey_k - 31.3.2004, 11:21


--------------------
PM MAIL WWW   Вверх
Maverick
Дата 31.3.2004, 11:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1307
Регистрация: 22.9.2003
Где: Odessa, Ukraine

Репутация: 2
Всего: 10



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

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


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


--------------------
smile
PM ICQ GTalk   Вверх
<Spawn>
Дата 31.3.2004, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 44
Всего: 64



Все можно сделать с помощью 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;



--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
Jey_k
Дата 31.3.2004, 11:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


WEB-командир
****


Профиль
Группа: Комодератор
Сообщений: 4149
Регистрация: 16.11.2003
Где: Москва

Репутация: 1
Всего: 61



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;


Это сообщение отредактировал(а) Jey_k - 31.3.2004, 11:46


--------------------
PM MAIL WWW   Вверх
Maverick
Дата 31.3.2004, 12:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1307
Регистрация: 22.9.2003
Где: Odessa, Ukraine

Репутация: 2
Всего: 10



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


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

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



Это сообщение отредактировал(а) Maverick - 31.3.2004, 12:06


--------------------
smile
PM ICQ GTalk   Вверх
Jey_k
Дата 31.3.2004, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


WEB-командир
****


Профиль
Группа: Комодератор
Сообщений: 4149
Регистрация: 16.11.2003
Где: Москва

Репутация: 1
Всего: 61



Maverick
чей пример заработал?



--------------------
PM MAIL WWW   Вверх
Maverick
Дата 31.3.2004, 12:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1307
Регистрация: 22.9.2003
Где: Odessa, Ukraine

Репутация: 2
Всего: 10



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

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



--------------------
smile
PM ICQ GTalk   Вверх
Jey_k
Дата 31.3.2004, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


WEB-командир
****


Профиль
Группа: Комодератор
Сообщений: 4149
Регистрация: 16.11.2003
Где: Москва

Репутация: 1
Всего: 61



Maverick
да не за что в общем.
Обращайся
smile.gif


--------------------
PM MAIL WWW   Вверх
p0s0l
Дата 1.4.2004, 09:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



Цитата
Модератор, сорри за оффтоп

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


--------------------
С уважением, г-н Посол.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0534 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.