Здраствуйте Эксперты. У меня проблема, переполнение стека при поиске файлов, код в приложении. Как быть, подскажите. Я думаю это из-за рекурсии, но как от неё избавится - не могу догадаться =( Спасибо.
Доброе время суток, Igi(t)32! ну вот, нет там никакой ошибки, не знаю, у меня ничего не ругается и все работает Ответ отправлен: 19.05.2004, 21:38 Отправитель: futility Отвечает CrackLab
Здравствуйте, Igi(t)32! Да, переполнение стека происходит из-за рекурсии. Каждый раз при вызове рекурсивной процедуры в стеке освобождается примерно 180h+ байт для хранения данных и переменных используемых в процедуре. В DOS'овских программах стек выделяется очень небольшой, кажется 4000h байт и поэтому при такой рекурсии он очень быстро заканчивается. Как избавиться от этой проблемы? Ну например можно объявить переменную SRec как указатель на структуру SearchRec. Т.е. SRec : ^SearchRec, а потом в начале процедуры выделять память под эту структуру уже не в стеке, а в куче (область памяти в адресном пространстве программы, не занятая стеком и телом программы). Это делается с помощью функции New, т.е. New(SRec); А в оставшихся местах по правилам работы с указателем писать не SRec а SRec^ . Но это поможет очень несильно. На самом деле я даже сделал счетчик и он показал
что разницы нет, хотя после такого преобразования при каждом рекурсивном вызове в стеке отводится уже не 180h+ байт а 160h... Я еще полчасика подумал, но ничего просто не придумал. Есть всякие мысли, но они довольно сложные для реализации. Так что думаю от такой рекурсии придется отказаться или проверять стековый регистр sp и когда он приближается к 0 (например 500h), то прекращать рекурсию. Ответ отправлен: 20.05.2004, 00:02 Отправитель: CrackLab Отвечает sir henry
Доброе время суток, Igi(t)32! 1. Попробуйте увеличить размер стека. 2. Избавиться от рекурсии можно применяя цикл While или repeat. While not {Условие нахождения файла или больше файлов не осталось} do FindNext(); Repeat FindNext(); Until {Условие нахождения файла или больше файлов не осталось}; Ответ отправлен: 20.05.2004, 04:42 Отправитель: sir henry Отвечает Boriss
Приветствую Вас, Igi(t)32! Вот наваял объект на эту тему. Для моего диска С: нужно запускать в защищенном режиме (памяти иначе не хватит даже для папок) Не понятно что ежели будет, спрашивайте - отвечу
Приложение: Ответ отправлен: 20.05.2004, 15:05 Отправитель: Boriss
Форма отправки вопроса
Внимание!
Мы рекомендуем открывать рассылку в программе Internet Explorer 5.0+
или отправлять вопросы с сайта по адресу:
http://rusfaq.ru/cgi-bin/Message.cgi.