![]() |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
![]() |
Катя |
![]()
Сообщение
#1
|
![]() Новичок ![]() Группа: Пользователи Сообщений: 22 Пол: Женский Репутация: ![]() ![]() ![]() |
Помогите сделать так,чтобы не происходило переполнение стека.Что тут исправить?Заранее спасибо.
{$N+} не забываем пользоваться тегами ! Сообщение отредактировано: volvo - 5.11.2006 21:25 |
![]() ![]() |
klem4 |
![]()
Сообщение
#2
|
![]() Perl. Just code it! ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 4 100 Пол: Мужской Реальное имя: Андрей Репутация: ![]() ![]() ![]() |
Если эта рограмма с нашего форума, написанная Volvo (а она мне ее очень напоминает)То в ней все должно быть правильно ... Возможно файлов слишком много, но тогда переполнился бы массив а не стек, увелич MaxDegree ...
хотя опятьже из-за большего кол-ва файлов может произойти переполнение стека, так как процедура поиска рекурсивная. Сообщение отредактировано: klem4 - 16.01.2006 19:39 -------------------- perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
|
volvo |
![]()
Сообщение
#3
|
Гость ![]() |
klem4,
![]() Катя, если переполняется стек - то увеличь его размер: второй строкой программы (после {$N+}) добавь: {$M 50000, 0, 0}, ибо с динамическими переменными программа не работает... Если стек опять будет переполняться - можешь увеличить его размер до 65520. Это максимум, после этого для увеличения глубины рекурсии придется принимать другие меры... |
Катя |
![]()
Сообщение
#4
|
![]() Новичок ![]() Группа: Пользователи Сообщений: 22 Пол: Женский Репутация: ![]() ![]() ![]() |
Вы не думайте,я не пыталась эту задачу присвоить себе.Я знаю,её делал Volvo.Щас попробую.Спасибо ещё раз за помощь.
Не помогает,всё равно происходит переполнение.Это вообще можно исправить? |
volvo |
![]()
Сообщение
#5
|
Гость ![]() |
Примерное количество файлов и количество папок на диске C: какое у тебя?
|
Катя |
![]()
Сообщение
#6
|
![]() Новичок ![]() Группа: Пользователи Сообщений: 22 Пол: Женский Репутация: ![]() ![]() ![]() |
Папок примерно 3000,а файлов 50000
|
volvo |
![]()
Сообщение
#7
|
Гость ![]() |
Ясно...
Тогда, как видно, придется все-таки использовать динамическую память: type Тогда в стеке при рекурсивном вызове будет создаваться не переменная типа SearchRec, размером в 42 байта, а всего лишь указатель на нее (4-х байтовый)... Только теперь тебе придется исправлять {$M} на {$M 65520, 65520, 655360} |
Катя |
![]()
Сообщение
#8
|
![]() Новичок ![]() Группа: Пользователи Сообщений: 22 Пол: Женский Репутация: ![]() ![]() ![]() |
Хмм....У меня всё равно выдаёт перегрузку стека,а сейчас почему так??
|
volvo |
![]()
Сообщение
#9
|
Гость ![]() |
Значит, все равно большая вложенность рекурсии... Переделывай программу на итеративную ("разверни" рекурсию в итерацию).
|
Катя |
![]()
Сообщение
#10
|
![]() Новичок ![]() Группа: Пользователи Сообщений: 22 Пол: Женский Репутация: ![]() ![]() ![]() |
А не могли бы Вы помочь??А тоя сама не успею,да и не смогу.Пожалуйста!Мне надо в пятницу сдавать уже.
|
volvo |
![]()
Сообщение
#11
|
Гость ![]() |
Катя
Вот программа... Попробуй ее прогнать... Прикрепленные файлы ![]() |
Катя |
![]()
Сообщение
#12
|
![]() Новичок ![]() Группа: Пользователи Сообщений: 22 Пол: Женский Репутация: ![]() ![]() ![]() |
Volvo, огромное спасибо!
|
Катя |
![]()
Сообщение
#13
|
![]() Новичок ![]() Группа: Пользователи Сообщений: 22 Пол: Женский Репутация: ![]() ![]() ![]() |
Всё-таки есть проблема,программа не выводит ошибку,а просто останавливается на определённом этапе.Почему так происходит?
|
volvo |
![]()
Сообщение
#14
|
Гость ![]() |
![]() Кстати, на сколько останавливается? Может, просто считает? Или еще что-то делает? |
Катя |
![]()
Сообщение
#15
|
![]() Новичок ![]() Группа: Пользователи Сообщений: 22 Пол: Женский Репутация: ![]() ![]() ![]() |
Выводит ^C и останавливается, папок ну может около 300 проходит,а файлов 6000 где-то.
|
volvo |
![]()
Сообщение
#16
|
Гость ![]() |
![]() Я даже приблизительно не знаю, что может быть у тебя неправильно: 300 папок (при условии, что они все вложены друг в друга - это самый плохой вариант) потребуют 300*(256+4) байт динамической памяти, это всего чуть больше 76К, тебе же доступно почти 640К !!! Так что проблем отсюда быть не должно. Стек вообще не расходуется (от рекурсии я избавился)... Добавляй отладочную информацию и отлаживай программу на своей системе (попробуй после каждого pushStack выводить количество оставшейся доступной памяти через MemAvail, еще какую-нибудь информацию, я не знаю какую, но искать, почему программа работает "здесь", и не работает "там" я не могу, для этого надо отлаживать программу "там"), здесь тебе никто не помощник, потому что сбой ПОКА произошел только у тебя. Попробуй распечатывать имена папок, которые добавляются (pushStack), и те, которые извлекаются (PopStack)... Так ты хотя бы будешь точно знать, на какой папке остановилось сканирование, может это чем-то поможет... Ну, и наконец, что, обязательно СРАЗУ тестировать на огромных объемах? Начинай проверять с маленьких, вложенных папок, чтобы в них было 20-50 подпапок и несколько сотен файлов, потом переходи к чуть большим числам, кто же сразу начинает с максимальных тестов при поиске ошибок... |
Alenka |
![]()
Сообщение
#17
|
Группа: Пользователи Сообщений: 4 Пол: Мужской Репутация: ![]() ![]() ![]() |
Попробывала сдать вашу программу, но препод сказал вывести гистограмму из дохрена записей!
После изменения кол-ва записей больше 23х остальные не помещаются на экране, он сказал сделать либо прокрутку либо что бы гистограмма стоилась в файле(типа потом откроешь и покажешь!) Я пыталась сделать, но не как не получается! Помогите пожалуйста, он сказал сделать до завтра! ![]() Сообщение отредактировано: Alenka - 13.01.2007 15:16 |
volvo |
![]()
Сообщение
#18
|
Гость ![]() |
Чтобы вывести результаты в файл, достаточно поменять процедуру Gyst вот на это:
Procedure Gyst(const arr: array of integer; Вот так у меня выглядит в обычном блокноте файл GST.TXT (при выборе моноширинного шрифта Lucida Console, если оставить шрифт по умолчанию - то правый ряд цифр будет неровным... В DOS-овском редакторе, типа встроенного в Norton Commander, ничего менять не надо - там будет нормально отображаться...): ![]() |
Alenka |
![]()
Сообщение
#19
|
Группа: Пользователи Сообщений: 4 Пол: Мужской Репутация: ![]() ![]() ![]() |
Огромное, человеческое спасибо!
|
Alenka |
![]()
Сообщение
#20
|
Группа: Пользователи Сообщений: 4 Пол: Мужской Репутация: ![]() ![]() ![]() |
Ещё такой вопрос! Эта программа выводит размеры начиная с БОЛЬШИХ 1024, а например в папке windows основную часть составляют файлы меньшего 1024 размера. Не скажите как поправить? Ну что бы появился вначале гистограммы блок от 0-1024
![]() |
![]() ![]() |
![]() |
Текстовая версия | 20.07.2025 1:33 |