Форум: "Основная";
Текущий архив: 2004.08.22;
Скачать: [xml.tar.bz2];
ВнизПеременная по 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;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.03 c