Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

бред с оптимизацией [D7, WinXP]


Страницы:   1 2

Max ©   (2012-05-28 22:45:00) 

Обнаружил ошибку при дебаге программы - цикл for i:=1 to ... идет в обратном порядке 8-[] Соответсвенно не правильно работает программа. Два часа ломал голову в чем проблема - оказалось неправильно работает оптимизация в дельфи. Отключил галку - все стало нормально. Вопрос - как это решить нормально?


Pavia   (2012-05-29 09:31:00) [21]

За более чем 10 летний опыт общения с Delphi большую часть на D7 быг с оптимизацией встретился мне один раз.
В примере
> Max   (28.05.12 23:19) [3]

его нету.


Sha   (2012-05-29 09:08:00) [22]

Это не баг.
Счетчик повторений показан корректно. Того кода, что ты писал просто нет.
Ты же не возмущаешься тому, что что некоторые операторы при оптимизации выброшены.
Ты ведь программист, не так ли?


Германн   (2012-05-29 01:19:00) [23]


> DVM ©   (28.05.12 23:26) [4]
>
> xe2 все работает правильно

В Д2007 этот баг отладчика ещё присутствовал.


Max   (2012-05-29 00:08:00) [24]

Sha, понял, спасибо


Sha   (2012-05-29 00:05:00) [25]

Вот тебе еще более простой пример для иллюстрации [8]


procedure TForm1.FormCreate(Sender: TObject);
const
 a: array[5..7] of string = ('5', '6', '7');
var
 i: integer;
begin;
 for i:=Low(a) to High(a) do
   Memo1.Lines.Add(a[i]);
 end;


Memo1 заполняется верно, хотя дебаггер показывает значения i=3,2,1.

В ассемблерном коде видно, что перед выполнением цикла
в регистр esi заносится число повторений (3), а в ebx - адрес первой сроки.
Далее в цикле первый регистр уменьшается, второй - увеличивается.


Max   (2012-05-29 00:03:00) [26]


>При оптимизации кода компилятор может расщеплять управляющую >переменную на 2 регистра

ты прав, спасибо. я этого не знал. ошибка была в самой логике. можно тему закрыть)
ps: хотя для отладки это плохо

> мозги лучше себе отключи

комрад, иди с воскресенья протрезвей) бухтит тут с перепоя)


sniknik   (2012-05-28 23:39:00) [27]

> Ладно, отключил ее нафиг :) Все равно толку от нее минимум
мозги лучше себе отключи.


sniknik   (2012-05-28 23:38:00) [28]

> баги с оптимизацией натыкался
у тебя в голове баг... большой такой, серый, с извилинами. %)

ты куда смотришь? на i? с точкой останова на 30 строке. а нужно на AData с точкой на 22.
все правильно работает, оптимизирует, это ты это правильное поведение интерпретируешь как баг.


Sha   (2012-05-28 23:37:00) [29]

При оптимизации кода компилятор может расщеплять управляющую переменную на 2 регистра:
первый (тот, что виден в дебаггере) содержит оставшееся число повторений,
второй изменяется в заказанную тобой сторону.

Поставь точку прерывания внутри DoSomething, чтобы убедиться в этом.


Max   (2012-05-28 23:35:00) [30]

Ладно, отключил ее нафиг :) Все равно толку от нее минимум


DVM   (2012-05-28 23:33:00) [31]


>  D7

нету у мну


Max   (2012-05-28 23:30:00) [32]

я ж в заголовке писал D7 :)


DVM   (2012-05-28 23:26:00) [33]

xe2 все работает правильно и с оптимизацией и без


Max   (2012-05-28 23:19:00) [34]

Сложно выцепить сам код из проекта, что бы оно у вас скомпилилось. Сделал вам примерчик, который показывает суть проблемы. Создаете новое приложение. Добавляете новый юнит. Вставляете туда такой код


unit Unit2;

interface

uses Windows;

type TTestRecord = record
 BlaBla: string;
end;

var TestRecords: array[1..3] of TTestRecord = (
 (BlaBla: '1'),
 (BlaBla: '2'),
 (BlaBla: '3'));

procedure Test;

implementation

procedure DoSomething(const AData: string);
begin
 if AData <> '' then Sleep(1); //что бы не выкинул оптимизатор
end;

procedure Test;
var
 i: integer;
begin
 for i:=1 to High(TestRecords) do
   DoSomething(TestRecords[i].BlaBla);
end;

initialization
 test;

end.


Смотрите в отладчике в процедуре test цикл с включенной оптимизацией и без нее. Будет в одном случае 1 2 3. В другом 3 2 1

ps: кстати, уже раньше на другие баги с оптимизацией натыкался


Sha   (2012-05-28 23:00:00) [35]

> Max   (28.05.12 22:45)

ошибка у тебя, пока не доказал обратного


DVM   (2012-05-28 22:49:00) [36]


>  Два часа ломал голову в чем проблема - оказалось неправильно
> работает оптимизация в дельфи.

код в студию


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо