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

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

Переменная цикла с неверным начальнымзначением


kyn66 ©   (2009-11-09 15:39:00) 

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

  ...
  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/ Почему такое может быть. Что на это влияет?


kyn66   (2009-11-09 16:42:00) [1]


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


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


Anatoly Podgoretsky   (2009-11-09 16:24:00) [2]

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

Не нужно


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


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


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


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


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


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


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


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


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


kyn66   (2009-11-09 16:12:00) [6]


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


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


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


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


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


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


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


Amoeba   (2009-11-09 16:03:00) [8]


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

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


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

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


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

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


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


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


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


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

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

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


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


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


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


kyn66   (2009-11-09 15:51:00) [12]


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


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


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


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


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


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


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


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


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


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

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

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


Наверх

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