![]() |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
![]() |
Трисемёрки |
![]()
Сообщение
#1
|
|||
![]() Группа: Пользователи Сообщений: 6 Пол: Мужской Реальное имя: Владимир Репутация: ![]() ![]() ![]() |
Уважаемые господа программисты! Срочно нужна помощь в проверке правильности процедуры удаления бинарного дерева:
Program Vedomost; Вопрос: правильно ли проведена очистка памяти (память должна возвращаться в кучу перед завершением работы программы)? Возникает ошибка при выполнении удаления адреса a^.Adr. Сообщение отредактировано: klem4 - 17.04.2008 12:14 |
|||
![]() ![]() |
volvo |
![]()
Сообщение
#2
|
Гость ![]() |
Цитата Вопрос: правильно ли проведена очистка памяти (память должна возвращаться в кучу перед завершением работы программы)? Ответ - да... Во всяком случае FPC утечек в "куче" не показывает, возвращается вся выделенная память.Но все-таки: Procedure DelVedomost(var a:Adrzv); Цитата Возникает ошибка при выполнении удаления адреса a^.Adr. Какая ошибка? Мне ничего не выдало... Показывай, как создаешь дерево (в смысле, вызов SozdanieTree из основной программы...)Сообщение отредактировано: volvo - 17.04.2008 11:22 |
Трисемёрки |
![]()
Сообщение
#3
|
![]() Группа: Пользователи Сообщений: 6 Пол: Мужской Реальное имя: Владимир Репутация: ![]() ![]() ![]() |
Ответ - да... Во всяком случае FPC утечек в "куче" не показывает, возвращается вся выделенная память. Но все-таки: Procedure DelVedomost(var a:Adrzv); Какая ошибка? Мне ничего не выдало... Показывай, как создаешь дерево (в смысле, вызов SozdanieTree из основной программы...) Возможно ошибка есть при записи или чтения из файла, поэтому вся программа: Program Vedomost; |
volvo |
![]()
Сообщение
#4
|
Гость ![]() |
Опять-таки никаких ошибок не обнаружено... В какой последовательности и что ты делаешь, когда у тебя выскакивает ошибка (я больше про то, КАКАЯ ошибка спрашивать не буду: не хочешь отвечать - дело твое, программа нужна ТЕБЕ в конце концов, мне по барабану, сколько времени ты будешь ошибку искать, если не хочешь чтоб тебе помогли...)
У меня вот что было: Цитата(console) Vnimatelno izychite i zapomnite dannyy informatiy Dlia povtornogo oznakomlenia s pravilami nazmite 11: --------------------------- Dlia formirovania dereva nazmite 1: Dlia priamogo vivoda spiska na ekran nazmite 2: Dlia obratnogo vivoda spiska na ekran nazmite 3: Dlia simmetrichnogo vivoda spiska na ekran nazmite 4: Dlia dobavlenia elementa v spisok nazmite 5: Dlia ydalenia elementa iz spiska nazmite 6: Dlia poisca elementa nazmite 7: Dlia zapis v fail nazmite 8: Dlia vivoda iz faila nazmite 9: Dlia vixoda iz programmi nazmite 0: Vvedite nomer komandi: 1-------------------------------------------------------- Vvedite kollichestvo chelovek: 2 Vvedite tabelnii nomer rabotyschego: 23 Vvedite fameliu, imia, otchestvo rabochego: Vvedite mesto raboti, spetsialnost: dsfgdsfg Vvedite domashnii adres rabotauschego: dfgg Vvedite tabelnii nomer rabotyschego: 45 Vvedite fameliu, imia, otchestvo rabochego: dfgsdfg Vvedite mesto raboti, spetsialnost: sdfgdfgg Vvedite domashnii adres rabotauschego: ffggg Vvedite nomer komandi: 2 Tabelnii nomer:23 FIO: ------------------------------------------------------ Work: dsfgdsfg Adres: dfgg Tabelnii nomer:45 FIO: dfgsdfg----------------------------------------------- Work: sdfgdfgg Adres: ffggg Vvedite nomer komandi: 8-------------------------------------------------------- Cpisok yspeshno soxranen Vvedite nomer komandi: 9 Tabelnii nomer:23 FIO: ------------------------------------------------------ Work: dsfgdsfg Adres: dfgg Tabelnii nomer:45 FIO: dfgsdfg----------------------------------------------- Work: sdfgdfgg Adres: ffggg Vvedite nomer komandi: 0-------------------------------------------------------- Heap dump by heaptrc unit 18 memory blocks allocated : 1070/1120 18 memory blocks freed : 1070/1120 0 unfreed memory blocks : 0 True heap size : 163840 (144 used in System startup) True free heap : 163696 |
Трисемёрки |
![]()
Сообщение
#5
|
![]() Группа: Пользователи Сообщений: 6 Пол: Мужской Реальное имя: Владимир Репутация: ![]() ![]() ![]() |
Возможно, я плохо разбираюсь в теории динамических данных, но у меня в окне Watch при выходе из программы "не обнуляются" Tree^. Adr; Tree^.Prav; Tree^.Lev.
|
volvo |
![]()
Сообщение
#6
|
Гость ![]() |
А должны? То, что ты видишь - это уже "левые" значения, мусор, совершенно не то, что там было во время работы программы, если поставишь точку останова в DelVedomost - можешь в этом убедиться... У тебя ж сам Tree об-NIL-ен, а ты хочешь увидеть Tree^.{что-то}? Это называется разыменование нулевого указателя, что категорически запрещено.
Более новые компиляторы просто не показывают Tree^.Adr после выполнения Dispose(a), говорят "Cannot access memory at address $0" Кстати, еще один способ проверить, вся ли память высвобождается - это после вызова Pravila напечатать Writeln(MemAvail);, и то же самое сделать после освобождения памяти перед выходом из программы. Значения должны быть одинаковы... Только что проверил - и там и там 528032, все в порядке... |
Трисемёрки |
![]()
Сообщение
#7
|
![]() Группа: Пользователи Сообщений: 6 Пол: Мужской Реальное имя: Владимир Репутация: ![]() ![]() ![]() |
Большое спасибо volvo
|
![]() ![]() |
![]() |
Текстовая версия | 20.07.2025 6:30 |