![]() |
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]() ![]() ![]() |
|
FaHaT |
|
||||
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 3.12.2007 Репутация: нет Всего: нет |
Доброго времени суток. Проблема состоит в следующем: после цикла for n:=0 to 3 do отладчик показывает значение n=4 (это если n объявлена как локальная переменная текущей процедуры), если n глобальная перменная, то отладчик показывает n=0. В ОБОИХ случаях фактическое значение перменной n=0. Остается непонятным, почему отладчик показывает значение 4? может быть у меня паленый отладчик, или это баг делфи ?
P.S. Мне показалось тема и отражает суть... пока я разбирался с этой проблемой, мне удалось выяснить что проблема либо в кривой версии компилятора, либо в изначальном баге в отладчике. Собственна топик и был создан затем что бы понять в чем именно. Это сообщение отредактировал(а) FaHaT - 4.12.2007, 20:00 |
||||
|
|||||
Riply |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Комодератор Сообщений: 572 Регистрация: 27.3.2007 Где: St. Petersburg Репутация: 3 Всего: 32 |
После цикла for n:=0 to 3 do , значение переменной n не определено. P.S. Читай Help. |
|||
|
||||
Poseidon |
|
|||
![]() Delphi developer ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 5273 Регистрация: 4.2.2005 Где: Гомель, Беларусь Репутация: 53 Всего: 133 |
-------------------- Если хочешь, что бы что-то работало - используй написанное, если хочешь что-то понять - пиши сам... |
|||
|
||||
Teran |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 590 Регистрация: 9.9.2005 Где: Украина, Запорожь е Репутация: нет Всего: 3 |
Все привильно компилятор показывал, просто при прохождении цикла счетчик n постоянно увеличивается на единицу... а когда стал больше 3(второй параметр в цикле) - он цикл пропускает
Это сообщение отредактировал(а) Teran - 4.12.2007, 10:47 -------------------- Ни цего не понимаю |
|||
|
||||
Riply |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Комодератор Сообщений: 572 Регистрация: 27.3.2007 Где: St. Petersburg Репутация: 3 Всего: 32 |
Один из нас, видимо, перетрудился ![]() Попробую защититься. На этот код: procedure TdlgMain.SpeedButton2Click(Sender: TObject); var n: integer; begin for n := 0 to 3 do Windows.Beep(100, 100); ShowMessage(IntToStr(n)); end; компилятор выдает Warning следующего содержания: [Pascal Warning] uMain.pas(667): W1037 FOR-Loop variable 'n' may be undefined after loop А F1 из него приведет нас в Help, где все расписано. P.S. ShowMessage (у меня) выдает 4 ![]() |
|||
|
||||
MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 62 Всего: 128 |
а как тогда правильно отрабатывает код из VCL
![]() или при "досрочном" выходе из цикла переменная цикла всетаки имеет осмысленное значение? ![]() -------------------- There are always someone smarter than you... |
|||
|
||||
Riply |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Комодератор Сообщений: 572 Регистрация: 27.3.2007 Где: St. Petersburg Репутация: 3 Всего: 32 |
Видимо имеет. Но после цикла - нет. На выходе явным образом иницилизируется результат (Result := -1;) - иначе Warning. P.S. Кстати, я не совсем уверена, что в этом примере перебор будет идти именно от нуля и до GetCount - 1. Может статься, что перечисляться будет от GetCount - 1 до нуля. |
|||
|
||||
FaHaT |
|
|||
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 3.12.2007 Репутация: нет Всего: нет |
Видимо я непонятно выразился
![]() |
|||
|
||||
aktuba |
|
|||
![]() Смышленный ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1915 Регистрация: 24.4.2006 Где: Планета Земля Репутация: 16 Всего: 38 |
В данном случае, Result - это результат функции, т.е. глобальное значение. И при досрочном выходе из цикла будет содержать последнее используемое значение. -------------------- ![]() |
|||
|
||||
Riply |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Комодератор Сообщений: 572 Регистрация: 27.3.2007 Где: St. Petersburg Репутация: 3 Всего: 32 |
Это естественно. Я уже говорила: "читате Help." и обращала на это внимание в "Дата 4.12.2007, 14:56 (ссылка)" Эффект связан с работой оптимизатора. Более того: отнюдь не всегда, тот код, который мы "видим" соответствует "реальному" коду. ![]()
В этом нет необхоимости. Так и должно быть. Для эксперимента, попробуй отключить оптимизацию в опциях проекта. |
|||
|
||||
FaHaT |
|
|||
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 3.12.2007 Репутация: нет Всего: нет |
Riply,
Действительно помогло, огромное спасибо, в частности за терпение =). Но тогда получается что при включенном оптимизаторе я не смогу отследить текущее значение счетчика в цикле, при помощи отладчика? Кстати, нет ли у вас ссылки или книги где можно узнать поподробнее о работе оптимизатора ? Это сообщение отредактировал(а) FaHaT - 5.12.2007, 00:43 |
|||
|
||||
Riply |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Комодератор Сообщений: 572 Регистрация: 27.3.2007 Где: St. Petersburg Репутация: 3 Всего: 32 |
Для этого попробуй использовать цикл "while do". И еще: мое IMHO, что оптимизатор оключать не стоит. Он умный ![]() И уж точно не стоит работать попеременно (то с включенным, то нет).
К сожалению нет. Я бы и сама с большим удовольствием ее почитала ![]() |
||||
|
|||||
FaHaT |
|
|||
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 3.12.2007 Репутация: нет Всего: нет |
||||
|
||||
Riply |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Комодератор Сообщений: 572 Регистрация: 27.3.2007 Где: St. Petersburg Репутация: 3 Всего: 32 |
||||
|
||||
FaHaT |
|
|||
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 3.12.2007 Репутация: нет Всего: нет |
я бы не сказал что он будет "совершенно другой" возможно какие то различия будут в самом коде, хотя сомневаюсь, но уж точно те баги которые я исправил останутся исправленными. Так что имхо перед отладкой с помощью дебагера стоит отключить оптимизацию, а после окончания отладки можна снова её включить. Это сообщение отредактировал(а) FaHaT - 5.12.2007, 02:14 |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: Общие вопросы" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |