Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.078 c
14-1091553860
DDA
2004-08-03 21:24
2004.08.22
jmp +$06


14-1090881129
g-l-u-k
2004-07-27 02:32
2004.08.22
Как скомпилить *.exe


9-1083603796
Bim
2004-05-03 21:03
2004.08.22
Как передать управление процедуре?


14-1091803317
panov
2004-08-06 18:41
2004.08.22
Настройка правил сортировки в ProxyPlus.


3-1090847537
vlad_ri
2004-07-26 17:12
2004.08.22
Добавление lookup-поля в ClientDataSet в runtime





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский