Форум: "Основная";
Текущий архив: 2003.06.02;
Скачать: [xml.tar.bz2];
ВнизСтранное поведение переменной цикла Найти похожие ветки
← →
$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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.008 c