ПрограммированиеФорумОбщее

Работа с указателями в Delphi (3 стр)

Страницы: 1 2 3 4 Следующая »
#30
18:56, 20 апр 2012

TarasB
> Хоть одну назови. Только не надо про то, что переменные в отладчике не так показываются.
> Я знаю только одну ошибку компилятора Дельфи7, она связана с WideString.
Ошибка в оптимизаторе — это не что-то сверх естественное. Я встречал такое и в сях. GCC так вообще некоторые версии с /O3 очень часто генерировали нерабочий код. MSVC всыралась с PGO оптимизацией, причем хитро: все с виду работало, но демка в думе рассинхронизировалась при просмотре, чего никак не должно случаться.

К сожалению уже не вспомню деталей, так как я редко активно пишу код последнее время, и последний раз сталкивался с таким лет 5-7 назад. Все те проекты не в svn, то есть проследить никак. Могу только сказать, что ошибки были предельно тупые, на уровне одной независимой функции со сравнительно примитивной логикой.

Да и не сам я это придумал — пытаться отключать оптимизацию. Посоветовали уважаемые товарищи.

Ради интереса посчитал количество {$O-} в pas файлах на домашнем компе - нашел 9 штук. Есть более-менее независимые маленький файлы, но что-то мне вообще не охота устанавливать делфи и пытаться воспроизвести проблему, тем более я не помню где она была.

#31
19:05, 20 апр 2012

entryway
> Ошибка в оптимизаторе — это не что-то сверх естественное.

Начал издалека...

entryway
> тем более я не помню где она была.

XD

Я ни одной не видел. Единственная ошибка в компиляторе, что я нашёл, с оптимизатором не связана, она про WideString и я её уже сказал. Ну и ещё несколько тупостей, которые вроде как не баг, но жизнь портят - беззнаковость shr для знакового типа и невстраиваемость стандартных вещественных функций.

#32
19:37, 20 апр 2012

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;
#33
22:39, 21 апр 2012

Если это существенно, вот опции проекта:

Скачать файл options.gif

Попробовал использовать {$O-} в начале глючащей процедуры и {$O+} в конце. На работу программы не влияет.

#34
23:30, 21 апр 2012

old_proger
> Если это существенно, вот опции проекта:

Range Checking где?
IO Checking нах не нужен
Overflow checking поставь лучше.
Optimization для отладки убери, будет мешать.
Пересобери проект (а не перекомпилируй), то есть нажми Project->Build All. Тогда все вызываемые модули примут новые опции компилятора.

#35
10:31, 22 апр 2012

Лучше с логикой программы разбирайся. Дело не в настройках компилятора.

#36
11:59, 22 апр 2012

Serge
> Лучше с логикой программы разбирайся. Дело не в настройках компилятора.

Настройки компилятора нужны для того, чтобы было легче локализовать ошибку, чтобы было легче отладить программу и чтобы было легче разобраться с логикой.

#37
12:55, 22 апр 2012

костыль
> Ясно. Ну тогда тогда точно c Exit`ом короче будет;
Я тоже в таких случаях exit использую, но некоторые считают, что это "неструктурненько" (т.к. если не обратить на него внимания, то функция будет понята неверно).

#38
13:24, 22 апр 2012

kipar
> т.к. если не обратить на него внимания
Если не обращать внимания на код, то можно его не понять. :)

#39
14:42, 22 апр 2012

TarasB
> Настройки компилятора нужны для того, чтобы было легче локализовать ошибку,
> чтобы было легче отладить программу и чтобы было легче разобраться с логикой.
при работе с указателями легче не станет.

#40
14:53, 22 апр 2012

vlob
> при работе с указателями легче не станет.

Если ошибка связана с выходом за диапазон, то станет. Такое бывает, что вышел в одном месте, а последствия порчи памяти вылезли в другом
Ну и ещё момент: автор нигде не использовал указатели на элементы динамического массива?

#41
16:03, 22 апр 2012

TarasB
> Если ошибка связана с выходом за диапазон, то станет.
за диапазон базового типа? ну если только морально.

#42
16:04, 22 апр 2012

Кстати можешь Эврику(EurekaLog) поставить  и посмотреть что скажет. Может на какие мысли наведет

#43
16:18, 22 апр 2012

vlob
> за диапазон базового типа? ну если только морально.

Нет блин, за диапазон сознания!
У массивов тоже есть диапазон.

#44
17:57, 22 апр 2012

Я вот думаю, а что если упаковать запись?

TFragment = packed record
Страницы: 1 2 3 4 Следующая »
ПрограммированиеФорумОбщее

Тема в архиве.