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

Вниз

Странное поведение переменной цикла   Найти похожие ветки 

 
$Hic0 ©   (2003-05-21 13:31) [0]

Добрый день
Есть код...

r:=SE3.Value/100;
for i:=1 to MaxInt do begin
e:=random; bol:= (e<=r);
DeTree.AddToString(bol);
if (DeTree.Chislo>=SE1.value) then break;
end;


Он довольно простой, объект DeTree класса Derevo. Собственный класс основанны на TTreeView но сильно изменный в котором отсечена виуализация, Класс хорошо оттестирован и работает здорово. Но это все не важно...
Во время дебага переменная цикла i, почему-то.... всегда принимает постоянное значение и далеко не MaxInt,.... в чем это может быть дело, ума не приложу, наверняка какая-то ошибка компилятора, или у меня руки кривые...
каков будет диагноз?
Заранее спасибо


 
Skier ©   (2003-05-21 13:35) [1]


> наверняка какая-то ошибка компилятора, или у меня руки кривые...

Ну прям мания какая-то на компилятор всё валить ! :)

> Класс хорошо оттестирован и работает здорово.

компилятор думаешь не оттестирован ?

Оптимизацию отключи...


 
VMcL ©   (2003-05-21 13:36) [2]

Тип переменной "i"?


 
$Hic0 ©   (2003-05-21 13:41) [3]

integer;


 
VMcL ©   (2003-05-21 13:42) [4]

А какое постоянное значение?


 
$Hic0 ©   (2003-05-21 13:43) [5]

Кто-то намекал что руки кривые? :)

r:=SE3.Value/100;
for i:=1 to MaxInt do begin
k:=i;
e:=random; bol:= (e<=r);
DeTree.AddToString(bol);
if (DeTree.Chislo>=SE1.value) then break;
end;


Компилаятор строку k:=i НЕ КОМПИЛИРУЕТ!!! но при этом i принимает нужные значения, а значение k неизвестно, в режиме отладке, он просто напросто проскакивает эту строку, как-будто это комментарий какой-то....
В общем чудеса на виражах


 
Ihor Osov'yak ©   (2003-05-21 13:45) [6]

2 $Hic0 © (21.05.03 13:31)

посмотри по Ctrl_Alt_C

Для цыклов довольно часто в качестве переменной цыкла используется регистр, и часто вместо инкримента десремент использует - он у тебя просто как счетчик, внутри цыкла не используется, то какая разница куда его гнать - вверх или вниз. А сравнение с нулем на предмет окончания цыкла более ефективно - об оптимизации уже говорили выше..

Да, поставь в цыкле ShowMessage(IntToStr(i)) - понаблюдаешь "нормальное поведение" переменной..


 
Ihor Osov'yak ©   (2003-05-21 13:47) [7]

2 $Hic0 © (21.05.03 13:43)

.. ты, ваше благородие.. Варнинги и хинты почитал? Смысл уяснил?


 
$Hic0 ©   (2003-05-21 13:51) [8]

нету, батенька, варингов, нету и хинтов, насчет декремента завместо инекремента, может быть, не спорю... но чего он на явное присваивание переменной k значения переменной i никак не реагируеют? :)


 
Ihor Osov'yak ©   (2003-05-21 13:54) [9]

> $Hic0 © (21.05.03 13:51)

Потому что k нигде дальше не используется. А варнингов нет потому, что ты в опциях это дело запретил. Никогда так не делай.


 
Skier ©   (2003-05-21 13:56) [10]

>$Hic0 © (21.05.03 13:51)

> но чего он на явное присваивание переменной k значения переменной
> i никак не реагируеют?

У тебя в теле цикла используется i ,т.е. k := i;
а вот k уже не используется, поэтому компилятор выбрасывает
эту операцию присваивания за ненадобностью.



 
MBo ©   (2003-05-21 13:58) [11]

Компилятор не упертый и смышленый. Он видит - не используется i в цикле, значит, можно эту переменную не использовать, а по-крестьянски ECX, например, декрементировать - наиболее естественный способ организации простого цикла для процессора.
И в строчке k:=i смысла нет - так он ее и компилировать не будет.

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


 
KSergey ©   (2003-05-21 13:59) [12]

> Компилаятор строку k:=i НЕ КОМПИЛИРУЕТ!!!

Компилирует, но оптимизатор ее отбрасывает, по причине включенности оптимизатора и неиспользуетмости k, о чем выше и писали товарищи.


 
pasha_golub ©   (2003-05-21 14:08) [13]

У тебя же в цикле Break стоит, вот он и ни хрена не делает. Максимум несколько итераций, а потом выходит. А при очередном заходе - тоже самое, потому как таблица случайных величин постоянна, а ты не используешь Randomize


 
VMcL ©   (2003-05-21 14:15) [14]

Скорее всего Warnings и Hints отключены.


 
Skier ©   (2003-05-21 15:32) [15]

>pasha_golub © (21.05.03 14:08)

> У тебя же в цикле Break стоит, вот он и ни хрена не делает.

?!



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

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

Наверх




Память: 0.5 MB
Время: 0.019 c
1-2841
BillyJeans
2003-05-20 15:42
2003.06.02
QReport без DataSet?


14-3134
Jackson
2003-05-07 21:51
2003.06.02
TestTypes!Где взять?


8-3017
Дмитрий К.К.
2003-02-17 09:41
2003.06.02
Аппликация картинок


14-3048
kostya2000
2003-05-13 13:53
2003.06.02
TFT моники...


1-2849
Renegate
2003-05-22 08:22
2003.06.02
Перевод строк из ListBox в числовой формат.........