Главная страница
    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.008 c
1-2903
KA-87
2003-05-22 21:08
2003.06.02
Как засунуть свою прогу в меню


14-3139
Zergling
2003-05-14 11:24
2003.06.02
Как понять такой Record?


14-3107
SKing
2003-05-14 10:54
2003.06.02
Изменение DBCheckBox по двойному клику?


3-2794
moore
2003-05-14 15:17
2003.06.02
пример БД


14-3087
Knight
2003-05-11 01:17
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский