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

Вниз

Переменная по STEPу   Найти похожие ветки 

 
ASoft   (2004-08-06 04:43) [0]

Здравствуйте!
В процедуре OnMouseUp я использую цикл
For i : = 0 to m do
    If PtinRect(MyRect(XX,YY,Width,Height),
       point(MyOb.X, MyOb.Y)) then
      begin
       .....
      end;
{ m=, например, 10,
 MyRect - функция, MyOb - объект на экране(окне) }

При рохождение цикла в STEP(по F7), переменная i равна
совсем не тому, что должно, по идее, т.е. не 0-10, а большим
положительным числам. В чем тут может быть
ошибка? В каких случаях такое может происходить?
Спасибо


 
Бином Ньютоныч   (2004-08-06 06:52) [1]

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


 
ASoft   (2004-08-06 07:06) [2]

Бином Ньютоныч >>[1]
В таком случае, цикл выполняется не правильно, точнее,
не выполняется? И что же делать?


 
Кшд   (2004-08-06 07:09) [3]

ASoft   (06.08.04 07:06) [2]
цикл выполняется правильно
не нравится работа оптимизатора - отключите в Project->Options


 
ASoft   (2004-08-06 07:29) [4]

Кшд >> [3]
Очевидно, я чего-то не пойму!
Причем тут компилятор?
Ведь в других случаях циклы, с использованием
переменной-счетчика, по F7 показывают нормальный
отсчет (наводишь курсором на счетчик - результат переменной, в моем случае, это хаотичный набор цифр). Вот почему я и спрашиваю в каких случаях может быть, что счетчик не работает?
Объясните, пожалуйста.


 
Бином Ньютоныч   (2004-08-06 08:20) [5]

Цикл может не работать, если ты в его теле меняешь переменную цикла.

Значение переменной будет мняться в соответствии с твоим паскаль-кодом только если от ее значения зависит логика работы в теле цикла. Например, если логика требует прохождения по списку именно в определенном программистом порядке. В остальных случаях компилятор придерживается правила: не важно, каково текущее значение переменной, главное, чтобы количество итераций точно соответствовало заданному программистом.
Так как компилятор не может точно определить, когда необходимо соответствие переменной заданному тобой, то в НЕКОТОРЫХ случаях она изменяется соответственно написанному тобой, даже если от ее значения ничего не зависит. Или когда компиляор считает заданный программистом порядок итераций оптимальным.


 
TUser ©   (2004-08-06 09:08) [6]

Да еще если цикл закончится, то значение его loop variable будет любым, даже если внутри цикла от нее что-то зависит.


 
ASoft   (2004-08-06 09:55) [7]

Бином Ньютоныч >>, TUser >>
Спасибо за ответы. В целом понятно.
Естественно, в цикле переменную-счетчик я не меняю,
да и Delphi подскажет, если это произойдет.
Может ли переменная-счетчик измениться (скажем, сброситься),
если в цикле временно управление передается другой, не
вложенной процедуре.


 
Digitman ©   (2004-08-06 10:06) [8]


> ASoft   (06.08.04 09:55) [7]


если очень постараться, то испоганить можно все что угодно

но если в вызванной в теле цикла п/программе ты не трогаешь РОН (или трогаешь с умом и полным пониманием дела) , то это никоим образом не повлияет на переменную цикла


 
Anatoly Podgoretsky ©   (2004-08-06 10:29) [9]

Выражение For i : = 0 to m означает только одно выполнить цикл End - Start + 1 раз и ничего более


 
ASoft   (2004-08-06 11:16) [10]

Digitman >> [8]
Стараюсь не "испоганить"... Что такое РОН, объясни тупому.
Anatoly Podgoretsky >> [9]
>> "Выражение For i : = 0 to m означает только одно выполнить цикл End - Start + 1 раз и ничего более" >>
Само-собой!

Спасибо всем.
В общем, понятно.


 
Digitman ©   (2004-08-06 11:21) [11]


> ASoft   (06.08.04 11:16) [10]


РОН = Регистр(ы) Общего Назначения (процессора)


 
Anatoly Podgoretsky ©   (2004-08-06 11:52) [12]

ASoft   (06.08.04 11:16) [10]
Отсюда не делай никаких предположений об внутренней организации, важно лишь указаное, а какой "порядок" дело компилятора и оптимизатора.


 
begin...end ©   (2004-08-06 12:44) [13]


> [9] Anatoly Podgoretsky ©   (06.08.04 10:29)

Неужели так категорично?
Интересно, а Вы такую ситуацию считаете правильной?

Т.е. если код

for I := 1 to 5 do
 ShowMessage(IntToStr(I));


приведёт вначале к появлению сообщения "2", то это - в порядке вещей?


 
Бином Ньютоныч   (2004-08-06 16:29) [14]

>begin...end ©   (06.08.04 12:44) [13]

Не приведет ни к 2, ни к 5, ни к 4. Первым будет 1 - переменная используется внутри цикла.


 
ASoft   (2004-08-06 17:35) [15]

Господа,
я вообще-то спросил только, почему
по F7 - step, при наведении курсора на
счетчик в цикле от 0 до 10 показывает, например 64622, а
не 0..10. Хотя в прорцедуре и в самом цикле, вроде бы,
все нормально.
Но дискуссия интересна сама по себе...


 
Fay ©   (2004-08-06 17:59) [16]

2Digitman ©   (06.08.04 11:21) [11]
А я-то решил, что РОН - ПОХ 8). И весьма удивился


 
Digitman ©   (2004-08-06 18:09) [17]


> ASoft   (06.08.04 17:35) [15]


> почему
> по F7 - step, при наведении курсора на
> счетчик в цикле от 0 до 10 показывает, например 64622, а
> не 0..10


потому что ячейки памяти с "именем" i не существует
компилятор волен ассоциировать идентификатор i с тем РОН, который он посчитает нужным выбрать в кач-ве "временного хранителя"  значения сч-ка цикла .. в то же время компилятор волен в нужный момент сохранив значение этого РОН в стеке использовать его временно для иных целей


 
Digitman ©   (2004-08-06 18:10) [18]


> Fay ©   (06.08.04 17:59) [16]


всяк думает в меру своей испорченности)


 
begin...end ©   (2004-08-06 18:40) [19]


> [14] Бином Ньютоныч   (06.08.04 16:29)

Да, понятно, просто [13] было ответной реакцией на [9]


 
Anatoly Podgoretsky ©   (2004-08-06 19:05) [20]

Есть использование, это приведт к нужному порядку, в тоже время ничего не говорит об переменных, например оптимизатор модет завести два регистра и один из них наращивать от 1 до пяти, а второй уменьшать от 5 до нудя, или же из константы 6 вычитать этот второй регистр - 5, 4...1


 
Германн ©   (2004-08-07 03:33) [21]

Кстати интересно.
Компиллятор Дельфи оказывается достаточно умным, чтобы не использовать переменную цикла как отдельную переменную!

Почему же IDE не может создать при отладке "отображение переменной цикла", которое и удовлетворяет тексту программы и соответствует коду программы?"


 
ASoft   (2004-08-07 05:43) [22]

Кстати, когда я убрал функцию MyRect (см. ASoft[0] ) из
puplic в private, то по F7, в точке прерывания, подсказка переменной i(счетчик) стала нормальной, как положено - от 0 до 10. На счет того, что иногда в цикле бывает странность: вместо
0..10, переменная считается наоборот от 10 до 0, хотя установлен оператор "to".


 
Anatoly Podgoretsky ©   (2004-08-07 13:14) [23]

Германн ©   (07.08.04 03:33) [21]
Предлагаешь отладчику заняться декомпиляцией и рефакторингом?


 
Германн ©   (2004-08-08 03:22) [24]

2 Anatoly Podgoretsky ©   (07.08.04 13:14) [23]
Ты спрашиваешь о "встроенном отладчике" или о "внешнем"?

По сабжу - речь идет о "встроенном", но ведь и он и компиллятор имеют одни и те же входные параметры. Имхо, они имеют все возможности, чтобы адекватно реагировать на все ситуации. Is"nt it?


 
Anatoly Podgoretsky ©   (2004-08-08 13:10) [25]

is not


 
Германн ©   (2004-08-09 02:46) [26]

А почему тогда "is not"? Какие веские причины тому? Или все из разряда "лопай, что дают"?

2 AP (08.08.04 13:10) [25]
Кстати, те кто учил меня аглицкому говорили, что отрицательный ответ на "is"nt it" - есть "(No,) It isn"t".


 
Fay ©   (2004-08-09 07:48) [27]

2 Германн ©   (09.08.04 02:46) [26]
>>  "is"nt it" - есть "(No,) It isn"t"
А как хоть это переводится? В хелпе нету...
8)


 
Германн ©   (2004-08-10 03:24) [28]

2 Fay ©   (09.08.04 07:48) [27]
Ну это то вообще-то к "потрепаться".
Но меня учили так - Если произносишь утверждение, в котором не уверен, или сие утверждение противоречит мнению собеседника, то стоит добавить "Is"nt it", что может быть переведено как "не так ли?", а имея в виду, что можешь сам ошибаться, в последнем случае "Is"nt it" имеет значение - ("или я не прав?") ("или это не так?")



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

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

Наверх




Память: 0.54 MB
Время: 0.059 c
14-1091613462
zamkom
2004-08-04 13:57
2004.08.22
InstallShild


3-1091022448
r00t
2004-07-28 17:47
2004.08.22
Как отобразить формулы и т.д. в бд?


1-1091666566
rosl
2004-08-05 04:42
2004.08.22
showmessage


3-1090903887
AntiBot
2004-07-27 08:51
2004.08.22
Счетчик


9-1083352477
MrAngel
2004-04-30 23:14
2004.08.22
FDirect3D._Release - какой правильный спосоп освобождения обьекта