Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Object Pascal: кроссплатформенные технологии > Нехватка памяти


Автор: Igor_K 4.2.2008, 22:33
Добрый вечер, программисты.
Пишет вам ламер еще тот smile

Вообщем написал лабу, достаточно объемную. 1200 строк кривейшего кода.
Работает, но после длительного пользования ею некоторое время, она вылетает с ошибкой Error 202: Stack overflow error.. Я так понял, что это связано с нехваткой памяти, типа... Я перевел фрагменты кода, гдте требуется достаточно много памяти на динамическую память... Поюзать программу стало можно дольше, но всеравно через определенное время юзания она вылетает с этой ошибкой.

С чем это может быть связано? Можно ли очистить этот стек? Я начинающий в программировании и многого еще не понимаю. Я увеличил размер стека при компиляции, но всеравно походу не хватает.


Еще заоодно задам вопрос. Я так понял, что указатель на память нельзя использовать как счетчик цикла. Или можно? 

Спасибо большое за ответ. 

Автор: volvo877 4.2.2008, 22:48
Цитата(Igor_K @  4.2.2008,  21:33 Найти цитируемый пост)
С чем это может быть связано?

Большой размер процедур/функций, большие локальные массивы или просто много локальных переменных (они размещаются именно в стеке), рекурсия (чем глубже - тем, соответственно, быстрее наступит переполнение стека).

Можешь привести код? Так просто можно будет гораздо быстрее выяснить истинную причину нехватки стека (если не хочешь выкладывать здесь - можешь выслать на "мыло" volvo71<мяу>yandex<dot>ru)...


Цитата(Igor_K @  4.2.2008,  21:33 Найти цитируемый пост)
Я так понял, что указатель на память нельзя использовать как счетчик цикла.
Управляющая переменная цикла должна быть локальной для данной подпрограммы переменной перечислимого типа.

Автор: Igor_K 4.2.2008, 22:57
ок. я щяс вышлю. Просто не хочу позориться тут с таким кривым кодом.

Добавлено через 13 минут и 11 секунд
Я выслал. Она очень кривая. Компилить лучше в ТурбоПаскаль.

Автор: volvo877 4.2.2008, 23:31
Как я и говорил, у тебя рекурсия, причем там, где ты ее и не видишь, наверное: процедура addtodb вызывает mainpage, а mainpage в свою очередь вызывает addtodb. Это неправильная структура программы. Должна быть основная процедура или функция, и из нее - вызов функций, по окончанию работы функции управление должно возвращаться назад (естественным путем, подпрограмма завершилась - управление вернулось к вызвавшей ее части) в основную подпрограмму, а не вызывать эту самую подпрограмму.

Вот когда ты вызываешь из первой процедуры вторую, а из второй - первую, получается рекурсия, причем не простая, а косвенная, которая и пожирает память (больше, чем обычная, естественно, все же заталкивается в стек, который не освобождается, а только заполняется)...

Добавлено через 1 минуту и 4 секунды
Цитата(Igor_K @  4.2.2008,  21:57 Найти цитируемый пост)
Компилить лучше в ТурбоПаскаль. 

А вот это ты зря. Некоторые вещи FreePascal-ем ловятся "на ура", зачем же упускать такую возможность? smile

Автор: Igor_K 4.2.2008, 23:48
volvo877, спасибо большое за помощь!!! 
Я думал так можно. Теперь буду знать, что нельзя. 
Извини, репутацию не могу добавить... Постов у меня не хватает.

Добавлено через 1 минуту и 34 секунды
В фри-паскаль у меня проблема с таблицей. Криво отображается. 

Автор: Igor_K 5.2.2008, 18:52
Переделал программу. Вроде теперь такого не наблюдаю.

А можно ли вообще очистить этот стек? Это так вопрос для саморазвития.

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