![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Переменная цикла с неверным начальнымзначением
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
Не должна ни разу.