TarasB
> Хоть одну назови. Только не надо про то, что переменные в отладчике не так показываются.
> Я знаю только одну ошибку компилятора Дельфи7, она связана с WideString.
Ошибка в оптимизаторе — это не что-то сверх естественное. Я встречал такое и в сях. GCC так вообще некоторые версии с /O3 очень часто генерировали нерабочий код. MSVC всыралась с PGO оптимизацией, причем хитро: все с виду работало, но демка в думе рассинхронизировалась при просмотре, чего никак не должно случаться.
К сожалению уже не вспомню деталей, так как я редко активно пишу код последнее время, и последний раз сталкивался с таким лет 5-7 назад. Все те проекты не в svn, то есть проследить никак. Могу только сказать, что ошибки были предельно тупые, на уровне одной независимой функции со сравнительно примитивной логикой.
Да и не сам я это придумал — пытаться отключать оптимизацию. Посоветовали уважаемые товарищи.
Ради интереса посчитал количество {$O-} в pas файлах на домашнем компе - нашел 9 штук. Есть более-менее независимые маленький файлы, но что-то мне вообще не охота устанавливать делфи и пытаться воспроизвести проблему, тем более я не помню где она была.
entryway
> Ошибка в оптимизаторе — это не что-то сверх естественное.
Начал издалека...
entryway
> тем более я не помню где она была.
XD
Я ни одной не видел. Единственная ошибка в компиляторе, что я нашёл, с оптимизатором не связана, она про WideString и я её уже сказал. Ну и ещё несколько тупостей, которые вроде как не баг, но жизнь портят - беззнаковость shr для знакового типа и невстраиваемость стандартных вещественных функций.
Darthman
> Какой смысл ставить continue в конце итерации цикла?
А, вон ты о чем, хм, действительно.
kipar
> Все в порядке. Это процедура добавления фрагмента, она ищет первый "умерший" и
> использует его повторно. Если таковых нет - добавляет новый. Так что тут все
> ок.
Ясно. Ну тогда тогда точно c Exit`ом короче будет;
procedure TPowerEngine.launch_fragment; var i : integer; fragm : PFragment; begin for i := 0 to objects.Count - 1 do begin fragm := objects.Items[i]; if (not fragm.state) then begin RestartFragment( fragm); Exit; end; end; new( fragm); RestartFragment( fragm); objects.Add( fragm); end;
Если это существенно, вот опции проекта:
Попробовал использовать {$O-} в начале глючащей процедуры и {$O+} в конце. На работу программы не влияет.
old_proger
> Если это существенно, вот опции проекта:
Range Checking где?
IO Checking нах не нужен
Overflow checking поставь лучше.
Optimization для отладки убери, будет мешать.
Пересобери проект (а не перекомпилируй), то есть нажми Project->Build All. Тогда все вызываемые модули примут новые опции компилятора.
Лучше с логикой программы разбирайся. Дело не в настройках компилятора.
Serge
> Лучше с логикой программы разбирайся. Дело не в настройках компилятора.
Настройки компилятора нужны для того, чтобы было легче локализовать ошибку, чтобы было легче отладить программу и чтобы было легче разобраться с логикой.
костыль
> Ясно. Ну тогда тогда точно c Exit`ом короче будет;
Я тоже в таких случаях exit использую, но некоторые считают, что это "неструктурненько" (т.к. если не обратить на него внимания, то функция будет понята неверно).
kipar
> т.к. если не обратить на него внимания
Если не обращать внимания на код, то можно его не понять. :)
TarasB
> Настройки компилятора нужны для того, чтобы было легче локализовать ошибку,
> чтобы было легче отладить программу и чтобы было легче разобраться с логикой.
при работе с указателями легче не станет.
vlob
> при работе с указателями легче не станет.
Если ошибка связана с выходом за диапазон, то станет. Такое бывает, что вышел в одном месте, а последствия порчи памяти вылезли в другом
Ну и ещё момент: автор нигде не использовал указатели на элементы динамического массива?
TarasB
> Если ошибка связана с выходом за диапазон, то станет.
за диапазон базового типа? ну если только морально.
Кстати можешь Эврику(EurekaLog) поставить и посмотреть что скажет. Может на какие мысли наведет
vlob
> за диапазон базового типа? ну если только морально.
Нет блин, за диапазон сознания!
У массивов тоже есть диапазон.
Я вот думаю, а что если упаковать запись?
TFragment = packed record
Тема в архиве.