Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.12.27;
Скачать: CL | DM;

Вниз

Переменная цикла с неверным начальнымзначением   Найти похожие ветки 

 
kyn66 ©   (2009-11-09 15:39) [0]

Столкнулся с ситуацией, прогоняяя пошагово в отладчике программу.

  ...
  st := TStringList.Create;
  tir_st := TStringList.Create;
  ListBox1.Clear;
  for i := 1 to KolLotery do
   begin
     tir_st.Clear;
     if TirNumb_A[i].LastNum < TirLast_A[i] then


При превом вхожденнии в цикл переменная i должна бы иметь значение 1, однако она равна 4 (http://yurec66.narod.ru/Vopros/cikl.jpg). Значение KolLotery = 4. Проходя цикл пошагово, переменная i принимает значения 4,3,2,1. Хотя в итоге все отрабатывает правильно. Да и реальные значения массивов TirNumb_A[i].LastNum < TirLast_A[i] при определенном значении i показывает неверно в Watches List/ Почему такое может быть. Что на это влияет?


 
Медвежонок Пятачок ©   (2009-11-09 15:42) [1]

переменная i должна бы иметь значение 1

Не должна ни разу.


 
Сергей М. ©   (2009-11-09 15:43) [2]


> Что на это влияет?


Это рез-т работа оптимизирующего алгоритма компилятора.
Оптимизатор можно отключить в опциях компилятора в св-вах проекта.


> в итоге все отрабатывает правильно


Тогда о чем забота, если в итогое все в порядке ?


 
kyn66 ©   (2009-11-09 15:51) [3]


> Это рез-т работа оптимизирующего алгоритма компилятора.


Я предполагал, что что то с настройками компилятора, но не думал что в этом месте. Сергей, ты как всегда прав! Отключил - все показывает правильно. Значит для отладки оптимизацию ваще отключать нужно, только в момент окончательной сборки включить.


> Тогда о чем забота, если в итогое все в порядке ?


Да "блоху" одну выловить не могу. Не принимает нужного значения, а тут еще и цикл в обратном порядке работает :)


 
kyn66 ©   (2009-11-09 15:55) [4]


> Медвежонок Пятачок ©   (09.11.09 15:42) [1]
> переменная i должна бы иметь значение 1Не должна ни разу.
>


В данной интерпритации for i := 1 to KolLotery do - обязана!


 
Медвежонок Пятачок ©   (2009-11-09 15:56) [5]

В данной интерпритации for i := 1 to KolLotery do - обязана!

Хрен то правда.


 
Сергей М. ©   (2009-11-09 15:57) [6]


> тут еще и цикл в обратном порядке работает


Оптимизирующий компилятор - он не такой идиот как тебе кажется.
Если он видит, что для достижения конечного результата порядок обхода элементов не важен , он будет управлять переменной цикла так как он сочтет оптимальней с т.з. производительности и ресурсов памяти.


 
Amoeba ©   (2009-11-09 16:03) [7]


> а тут еще и цикл в обратном порядке работает

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


> Не принимает нужного значения

Принимает сперва последнее значение и далее декрементируется.


> Значит для отладки оптимизацию ваще отключать нужно, только
> в момент окончательной сборки включить.

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


 
Дмитрий Белькевич   (2009-11-09 16:05) [8]


> В данной интерпритации for i := 1 to KolLotery do - обязана!


Оптимизатор делает за тебя работу. Радуйся.


 
kyn66 ©   (2009-11-09 16:12) [9]


> Оптимизатор делает за тебя работу. Радуйся.


Но мне то он об этом не сказал.... Хорошо Мастера(прошу заметить, сознательно пишу с большой буквы) подсказали... :) Век живи, век учись. Если кто хочет добавить (с ехидством... не нужно...) :)


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


Вот это и пытался сделать. А на одной переменной Raz :=  TirLast_A[i] - TirNumb_A[i].LastNum; ваще не давал поставить току останова (синяя точечка отсутствовала), пока я ее конкретно не задействовал.


 
Сергей М. ©   (2009-11-09 16:16) [10]


> пока я ее конкретно не задействовал


Оптимизатор попросту выкинул эту строчку из "рассмотрения" как совершенно бестолковую.


 
kyn66 ©   (2009-11-09 16:22) [11]


> Оптимизатор попросту выкинул эту строчку из "рассмотрения"
> как совершенно бестолковую.


Для него может и да, но для меня она была значащая, т.к. как говорил не мог отловить "блоху", промежуточное значение где-то терялось. Насколько помню включение оптимизации компилятора выходной размер кода немного уменьшает. Есть еще какое полезное воздействие от его включения?


 
Сергей М. ©   (2009-11-09 16:23) [12]


> Есть еще какое полезное воздействие от его включения?


Увеличение сквозной производительности алгоритма.


 
Anatoly Podgoretsky ©   (2009-11-09 16:24) [13]

> kyn66  (09.11.2009 15:51:03)  [3]

Не нужно


 
kyn66 ©   (2009-11-09 16:42) [14]


> Anatoly Podgoretsky ©   (09.11.09 16:24) [13]
> > kyn66  (09.11.2009 15:51:03)  [3]Не нужно


Как всегда лаконично. А обоснование какое есть? Вопрос был задан потому, что компилятор "дизорентировал" при отладке.



Страницы: 1 вся ветка

Текущий архив: 2009.12.27;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.018 c
15-1256645623
Rule
2009-10-27 15:13
2009.12.27
Как узнать таблицу разделов на дисках и вообще как это работает


2-1257412567
kyn66
2009-11-05 12:16
2009.12.27
Сохранение параметров программы одним числом


2-1257447516
Ivan
2009-11-05 21:58
2009.12.27
netsh с русскими символами


6-1208506264
VK
2008-04-18 12:11
2009.12.27
передача файлов по сети


2-1257617819
Fantnk
2009-11-07 21:16
2009.12.27
Завершение thread Не происходит