Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.01 c
14-3092
Deus
2003-05-13 16:42
2003.06.02
Ваше отношение к компьютерным клубам.


1-2997
_Alex_
2003-05-20 14:36
2003.06.02
d6 и диалог на основе TOpenPictureDialog


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


1-2886
123456
2003-05-22 16:36
2003.06.02
ShellExecute


1-2973
Disa
2003-05-21 13:10
2003.06.02
Циклы в потоке...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский