Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на языке Pascal


Информационный Канал Subscribe.Ru


RusFAQ.ru: Программирование на языке Pascal

Выпуск № 292
от 23.05.2004, 18:00

Администратор:
Имя: Sensey
URL: Информационный ресурс
ICQ: 105679124
Украина, Харьков
О рассылке:
Задано вопросов: 486
Отправлено ответов: 1802
Активность: 370.7 %
[Задать вопрос >>][Регистрация эксперта >>]
[Поиск в базе][Обсудить на форуме]


 Список экспертов, ответы которых опубликованы в данном выпуске

futility
Статус: Начальный
Общий рейтинг: 114.03
[Подробней >>]
CrackLab
Статус: Доверительный
Общий рейтинг: 153.12
[Подробней >>]
sir henry
Статус: Профессиональный
Общий рейтинг: 161.45
[Подробней >>]
 
Boriss
Статус: Профессиональный
Общий рейтинг: 161.87
URL: Программирование на Паскале
[Подробней >>]


 Краткий перечень вопросов

Вопрос № 486. Здраствуйте Эксперты. У меня проблема, переполнение стека при поиске файлов, код в приложении. Как б... (ответов: 4)

Вопросов: 1, ответов: 4


 Вопрос № 486

Здраствуйте Эксперты. У меня проблема, переполнение стека при поиске файлов, код в приложении. Как быть, подскажите. Я думаю это из-за рекурсии, но как от неё избавится - не могу догадаться =(
Спасибо.


Приложение:


Вопрос отправлен: 19.05.2004, 20:11
Отправитель: Igi(t)32 (6543210@list.ru)

[Следующий вопрос >>] [Список вопросов]

Отвечает futility

Доброе время суток, 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.

(C) 2002-2003 Команда RusFAQ.ru.

 Персональные данные

Ваше имя:

Ваш e-mail:

Опубликовать мой e-mail в рассылке


 Вопрос и дополнение

Ваш вопрос:


Приложение (если необходимо):


Получить ответов:


 Выбор рассылки

Программисту
Assembler (24)
C / C++ (15)
Perl (2)
Builder / Delphi (15)
Pascal (20)
Basic / VBA (2)
Java / JavaScript (4)
PHP (12)
Криптография (5)
WinAPI (7)
Радиоэлектроника (6)
Пользователю
Windows 95/98/Me (35)
Windows NT/2000/XP (47)
"Железо" (29)
Поиск информации (16)
Администратору
Windows NT/2000/XP (24)
Linux / Unix (9)
Юристу
Гражданское право (9)
Семейное право (7)
Трудовое право (8)
КоАП (6)

Отправить вопрос всем экспертам выбранной рассылки.




Задать вопрос | Регистрация эксперта | Поиск в базе | Чат | Форумы | Новости
Проект экспертов RusFAQ.ru | Фотоальбом | Virus.RusFAQ.ru | Администрирование
Профессиональная WEB-Студия B.I.T.


Яндекс цитирования
© 2001-2004 Россия, Москва. Авторское право: Калашников О.А.

http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу


В избранное