![]() |
Модераторы: Snowy, MetalFan, bems, Poseidon |
![]() ![]() ![]() |
|
overall |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 17.6.2007 Репутация: нет Всего: нет |
Здравствуйте. Вот такая вот фигня у меня. Уже третий день сижу мучаюсь не могу понять, где что не так.
Была процедура следующего вида: Весь код не привожу, больно большой.
Разбил её на две, путем выноса из под цикла:
Вынес правильно. В старой версии процедура рекурсивно вызывала саму себя. После разбивки соответственно рекурсия сохранилась, но опосредованно (ReadItemsTo -> ReadItem -> ReadItemsTo -> ReadItem -> ...). Компилится и работает, но в некоторых случаях возникает AV (Access Violation) в процедуре "DeleteFree()" в "getmem.inc" (системный модуль).
Всё это определенно очень странно. До разбития процедуры всё работало отлично без таких вот выкрутасов. Может это баг компилятора? (Пробовал и на Delphi 5 и на Delphi 6 - и там и там таже самая ошибка) Думаю, может что-то не так с выделением памяти, раз ошибка в DeleteFree (процедура стандартного менеджера памяти). Руками память не выделяю. Только создание и уничтожение объектов, ну и строки (длинные). Но если дело с памятью, то почему тогда всё отлично работает, когда процедура не разбита? Не понимаю... Подскажите, что-нибудь, пожалуйста! Это сообщение отредактировал(а) Alexeis - 17.6.2007, 12:01 |
||||||
|
|||||||
aktuba |
|
|||
![]() Смышленный ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1915 Регистрация: 24.4.2006 Где: Планета Земля Репутация: 7 Всего: 38 |
Скорее всего дело именно в рекурсии. Но что-бы сказать что-то определенное - надо смотреть весь код...
-------------------- ![]() |
|||
|
||||
Sunvas |
|
|||
![]() Соль и сахар ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3388 Регистрация: 12.3.2006 Где: Тосно Репутация: 2 Всего: 89 |
Порой действительно встречаються артефакты. Но, как уже было сказано - весь код в студию!
-------------------- Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их. |
|||
|
||||
overall |
|
||||
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 17.6.2007 Репутация: нет Всего: нет |
Разобрался сам.
Это был баг компилятора Delphi. Смотреть ассемблерный код не стал, разбираться что да почему.
Так вот из-за присвоения: ItemPrefix := APrefix; вся фигня и была. Дело в том, что параметр APrefix больше нигде не используется в этой процедуре. И видимо компилятор не производил никакого присваивания, а как-то с оптимизировал код, что просто APrefix "стал" ItemPrefix, но сделал это неправильно. После того, как переписал процедуру вот так:
никаких багов нет и GetHeapStatus не возвращает ошибки. В компиляторе Delphi 6 есть так же баг с переполнением стека FPU, размер которого 8 элементов. И при вычислении БОЛЬШОГО выражения с вещественными числами (на практике такие выражения встречаются наверное почти никогда), приводит к исключению, а именно к переполнению стека FPU. Они уж хотя бы проверку в компилятор добавили бы, что мол выражение слишком большое - переформулируйте. |
||||
|
|||||
aktuba |
|
||||
![]() Смышленный ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1915 Регистрация: 24.4.2006 Где: Планета Земля Репутация: 7 Всего: 38 |
Мдя... Смахивает на параною...
Хочешь сказать, у всех компилятор умеет присваивать строки, а у тебя разучился??? =)))) Ну если сам веришь в это - вперед. Но ... ![]() -------------------- ![]() |
||||
|
|||||
delphi_ |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 140 Регистрация: 30.11.2006 Репутация: нет Всего: -1 |
это не баг это фича
отключи оптимизацию ![]() |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |