Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Object Pascal: кроссплатформенные технологии > Нехватка памяти |
Автор: Igor_K 4.2.2008, 22:33 |
Добрый вечер, программисты. Пишет вам ламер еще тот ![]() Вообщем написал лабу, достаточно объемную. 1200 строк кривейшего кода. Работает, но после длительного пользования ею некоторое время, она вылетает с ошибкой Error 202: Stack overflow error.. Я так понял, что это связано с нехваткой памяти, типа... Я перевел фрагменты кода, гдте требуется достаточно много памяти на динамическую память... Поюзать программу стало можно дольше, но всеравно через определенное время юзания она вылетает с этой ошибкой. С чем это может быть связано? Можно ли очистить этот стек? Я начинающий в программировании и многого еще не понимаю. Я увеличил размер стека при компиляции, но всеравно походу не хватает. Еще заоодно задам вопрос. Я так понял, что указатель на память нельзя использовать как счетчик цикла. Или можно? Спасибо большое за ответ. |
Автор: volvo877 4.2.2008, 22:48 |
Большой размер процедур/функций, большие локальные массивы или просто много локальных переменных (они размещаются именно в стеке), рекурсия (чем глубже - тем, соответственно, быстрее наступит переполнение стека). Можешь привести код? Так просто можно будет гораздо быстрее выяснить истинную причину нехватки стека (если не хочешь выкладывать здесь - можешь выслать на "мыло" volvo71<мяу>yandex<dot>ru)... Управляющая переменная цикла должна быть локальной для данной подпрограммы переменной перечислимого типа. |
Автор: Igor_K 4.2.2008, 22:57 |
ок. я щяс вышлю. Просто не хочу позориться тут с таким кривым кодом. Добавлено через 13 минут и 11 секунд Я выслал. Она очень кривая. Компилить лучше в ТурбоПаскаль. |
Автор: volvo877 4.2.2008, 23:31 |
Как я и говорил, у тебя рекурсия, причем там, где ты ее и не видишь, наверное: процедура addtodb вызывает mainpage, а mainpage в свою очередь вызывает addtodb. Это неправильная структура программы. Должна быть основная процедура или функция, и из нее - вызов функций, по окончанию работы функции управление должно возвращаться назад (естественным путем, подпрограмма завершилась - управление вернулось к вызвавшей ее части) в основную подпрограмму, а не вызывать эту самую подпрограмму. Вот когда ты вызываешь из первой процедуры вторую, а из второй - первую, получается рекурсия, причем не простая, а косвенная, которая и пожирает память (больше, чем обычная, естественно, все же заталкивается в стек, который не освобождается, а только заполняется)... Добавлено через 1 минуту и 4 секунды А вот это ты зря. Некоторые вещи FreePascal-ем ловятся "на ура", зачем же упускать такую возможность? ![]() |
Автор: Igor_K 4.2.2008, 23:48 |
volvo877, спасибо большое за помощь!!! Я думал так можно. Теперь буду знать, что нельзя. Извини, репутацию не могу добавить... Постов у меня не хватает. Добавлено через 1 минуту и 34 секунды В фри-паскаль у меня проблема с таблицей. Криво отображается. |
Автор: Igor_K 5.2.2008, 18:52 |
Переделал программу. Вроде теперь такого не наблюдаю. А можно ли вообще очистить этот стек? Это так вопрос для саморазвития. |