![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Новичок
Джуниор
Регистрация: 17.06.2007
Сообщений: 2
|
![]()
Здравствуйте. Вот такая вот фигня у меня. Уже третий день сижу мучаюсь не могу понять, где что не так.
Была процедура следующего вида: Весь код не привожу, больно большой. Код:
Код:
В старой версии процедура рекурсивно вызывала саму себя. После разбивки соответственно рекурсия сохранилась, но опосредованно (ReadItemsTo -> ReadItem -> ReadItemsTo -> ReadItem -> ...). Компилится и работает, но в некоторых случаях возникает AV (Access Violation) в процедуре "DeleteFree()" в "getmem.inc" (системный модуль). Код:
Всё это определенно очень странно. До разбития процедуры всё работало отлично без таких вот выкрутасов. Может это баг компилятора? (Пробовал и на Delphi 5 и на Delphi 6 - и там и там таже самая ошибка) Думаю, может что-то не так с выделением памяти, раз ошибка в DeleteFree (процедура стандартного менеджера памяти). Руками память не выделяю. Только создание и уничтожение объектов, ну и строки (длинные). Но если дело с памятью, то почему тогда всё отлично работает, когда процедура не разбита? Не понимаю... Подскажите, что-нибудь, пожалуйста! |
![]() |
![]() |
![]() |
#2 |
Новичок
Джуниор
Регистрация: 17.06.2007
Сообщений: 2
|
![]()
Разобрался сам.
Это был баг компилятора Delphi. Смотреть ассемблерный код не стал, разбираться что да почему. Код:
ItemPrefix := APrefix; вся фигня и была. Дело в том, что параметр APrefix больше нигде не используется в этой процедуре. И видимо компилятор не производил никакого присваивания, а как-то с оптимизировал код, что просто APrefix "стал" ItemPrefix, но сделал это неправильно. После того, как переписал процедуру вот так: Код:
В компиляторе Delphi 6 есть так же баг с переполнением стека FPU, размер которого 8 элементов. И при вычислении БОЛЬШОГО выражения с вещественными числами (на практике такие выражения встречаются наверное почти никогда), приводит к исключению, а именно к переполнению стека FPU. Они уж хотя бы проверку в компилятор добавили бы, что мол выражение слишком большое - переформулируйте. |
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Переделать процедуру | AidarBik | Общие вопросы Delphi | 12 | 22.05.2008 14:59 |
подскажите процедуру | Nova | БД в Delphi | 5 | 15.05.2008 16:43 |
присвоить переменной целого типа значение поля key полученное в результате выполнения SQL запроса | Worms | БД в Delphi | 5 | 10.01.2008 21:07 |
Как вызвать процедуру ??? | Marat | Помощь студентам | 8 | 02.03.2007 15:11 |