Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> глюк отладчика или кривойкомпилятор ? 
:(
    Опции темы
FaHaT
Дата 4.12.2007, 02:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 3.12.2007

Репутация: нет
Всего: нет




M
Alexeis
Модератор: Название темы должно отражать ее суть!

Доброго времени суток. Проблема состоит в следующем: после цикла for n:=0 to 3 do отладчик показывает значение n=4 (это если n объявлена как локальная переменная текущей процедуры), если n глобальная перменная, то отладчик показывает n=0. В ОБОИХ случаях фактическое значение перменной n=0. Остается непонятным, почему отладчик показывает значение 4? может быть у меня паленый отладчик, или это баг делфи ?
Код

var
n,i,j,p: integer;
max: real;
mas,rez,mas2: array [0..3,0..4] of real;
buf,x: array [0..3] of real;
q: array [0..3] of integer;
str: string;
begin
  for i:=0 to 3 do
    for j:=0 to 4 do
      begin
        mas[i,j]:=strtofloat(slab.table.Cells[j,i]);
        mas2[i,j]:=mas[i,j];
      end;
  p:=0;
  for n:=0 to 3 do    
      begin
      max:=abs(mas[0,0]);
      for i:=0 to 3 do
        for j:=0 to 3 do
          if abs(mas[i,j])>=max then
            begin
              max:=mas[i,j];
              q[n]:=j;
              p:=i
            end;
    end;    


P.S. Мне показалось тема и отражает суть... пока я разбирался с этой проблемой, мне удалось выяснить что проблема либо в кривой версии компилятора, либо в изначальном баге в отладчике. Собственна топик и был создан затем что бы понять в чем именно.

Это сообщение отредактировал(а) FaHaT - 4.12.2007, 20:00
PM MAIL ICQ   Вверх
Riply
Дата 4.12.2007, 03:05 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Комодератор
Сообщений: 572
Регистрация: 27.3.2007
Где: St. Petersburg

Репутация: 3
Всего: 32



Цитата(FaHaT @  4.12.2007,  02:11 Найти цитируемый пост)
после цикла for n:=0 to 3 do отладчик показывает значение n=4 (это если n объявлена как локальная переменная текущей процедуры), если n глобальная перменная, то отладчик показывает n=0.


После цикла for n:=0 to 3 do ,  значение переменной n не определено.

P.S.
 Читай Help.
PM MAIL   Вверх
Poseidon
Дата 4.12.2007, 10:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 53
Всего: 133



Цитата(Riply @  4.12.2007,  03:05 Найти цитируемый пост)
После цикла for n:=0 to 3 do ,  значение переменной n не определено.
А мне что-то казалось, что после такого цикла n=3!!!



--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
Teran
Дата 4.12.2007, 10:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 590
Регистрация: 9.9.2005
Где: Украина, Запорожь е

Репутация: нет
Всего: 3



Все привильно компилятор показывал, просто при прохождении цикла счетчик n постоянно увеличивается на единицу... а когда стал больше 3(второй параметр в цикле) - он цикл пропускает

Это сообщение отредактировал(а) Teran - 4.12.2007, 10:47


--------------------
Ни цего не понимаю
PM MAIL ICQ   Вверх
Riply
Дата 4.12.2007, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Комодератор
Сообщений: 572
Регистрация: 27.3.2007
Где: St. Petersburg

Репутация: 3
Всего: 32



Цитата(Poseidon @  4.12.2007,  10:16 Найти цитируемый пост)
А мне что-то казалось, что после такого цикла n=3!!!


Один из нас, видимо, перетрудился smile  

Попробую защититься.
На этот код:
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  smile 

PM MAIL   Вверх
MetalFan
Дата 4.12.2007, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



Цитата(Riply @  4.12.2007,  14:06 Найти цитируемый пост)
W1037 FOR-Loop variable 'n' may be undefined after loop

а как тогда правильно отрабатывает код из VCL
Код

function TStrings.IndexOf(const S: string): Integer;
begin
  for Result := 0 to GetCount - 1 do
    if CompareStrings(Get(Result), S) = 0 then Exit;
  Result := -1;
end;

 smile 
или при "досрочном" выходе из цикла переменная цикла всетаки имеет осмысленное значение?  smile 


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Riply
Дата 4.12.2007, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Комодератор
Сообщений: 572
Регистрация: 27.3.2007
Где: St. Petersburg

Репутация: 3
Всего: 32



Цитата(MetalFan @  4.12.2007,  14:23 Найти цитируемый пост)
а как тогда правильно отрабатывает код из VCL


Цитата(MetalFan @  4.12.2007,  14:23 Найти цитируемый пост)
или при "досрочном" выходе из цикла переменная цикла всетаки имеет осмысленное значение? 


Видимо имеет. 
Но после цикла - нет. На выходе явным образом иницилизируется результат (Result := -1;) - иначе Warning.

P.S.
 Кстати, я не совсем уверена, что в этом примере перебор будет идти
 именно от нуля и до GetCount - 1.
 Может статься, что перечисляться будет от GetCount - 1 до нуля.


PM MAIL   Вверх
FaHaT
Дата 4.12.2007, 19:52 (ссылка)   | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 3.12.2007

Репутация: нет
Всего: нет



Видимо я непонятно выразился  smile . НЕ ПОСЛЕ ЦИКЛА значение n становится равным 4, а сразу же после строки for n:=0 to 3 do, т.е. в теле цикла ! Затем оно в процессе выполнения цикла уменьшается вплоть до 0. При необходимости могу выложить исходник, но лучше просто вставьте описанную мной процедуру и проверьте значение n в теле цикла. Прошу отнестись к этому серьезнее... 
PM MAIL ICQ   Вверх
aktuba
Дата 4.12.2007, 20:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Смышленный
***


Профиль
Группа: Завсегдатай
Сообщений: 1915
Регистрация: 24.4.2006
Где: Планета Земля

Репутация: 16
Всего: 38



Цитата(MetalFan @  4.12.2007,  15:23 Найти цитируемый пост)
а как тогда правильно отрабатывает код из VCL

    
function TStrings.IndexOf(const S: string): Integer;
begin
  for Result := 0 to GetCount - 1 do
    if CompareStrings(Get(Result), S) = 0 then Exit;
  Result := -1;
end;

или при "досрочном" выходе из цикла переменная цикла всетаки имеет осмысленное значение?  smile  

В данном случае, Result - это результат функции, т.е. глобальное значение. И при досрочном выходе из цикла будет содержать последнее используемое значение.




--------------------
user posted image
PM MAIL WWW Skype   Вверх
Riply
Дата 4.12.2007, 23:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Комодератор
Сообщений: 572
Регистрация: 27.3.2007
Где: St. Petersburg

Репутация: 3
Всего: 32



Цитата(FaHaT @  4.12.2007,  19:52 Найти цитируемый пост)
Видимо я непонятно выразился   . НЕ ПОСЛЕ ЦИКЛА значение n становится равным 4, а сразу же после строки for n:=0 to 3 do, т.е. в теле цикла ! Затем оно в процессе выполнения цикла уменьшается вплоть до 0.


Это естественно. Я уже говорила: "читате Help." и обращала на это внимание в "Дата 4.12.2007, 14:56 (ссылка)" 
Эффект связан с работой оптимизатора.
Более того: отнюдь не всегда, тот код, который мы "видим" соответствует "реальному" коду. smile 

Цитата(FaHaT @  4.12.2007,  19:52 Найти цитируемый пост)
При необходимости могу выложить исходник, но лучше просто вставьте описанную мной процедуру и проверьте значение n в теле цикла. Прошу отнестись к этому серьезнее... 


В этом нет необхоимости. Так и должно быть. 
Для эксперимента, попробуй отключить оптимизацию в опциях проекта.

PM MAIL   Вверх
FaHaT
Дата 5.12.2007, 00:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 3.12.2007

Репутация: нет
Всего: нет



Riply
Действительно помогло, огромное спасибо, в частности за терпение =). 

Но тогда получается что при включенном оптимизаторе я не смогу отследить текущее значение счетчика в цикле, при помощи отладчика? 
Кстати, нет ли у вас ссылки или книги где можно узнать поподробнее о работе оптимизатора ?


Это сообщение отредактировал(а) FaHaT - 5.12.2007, 00:43
PM MAIL ICQ   Вверх
Riply
Дата 5.12.2007, 01:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Комодератор
Сообщений: 572
Регистрация: 27.3.2007
Где: St. Petersburg

Репутация: 3
Всего: 32



Цитата(FaHaT @  5.12.2007,  00:41 Найти цитируемый пост)
Но тогда получается что при включенном оптимизаторе я не смогу отследить текущее значение счетчика в цикле, при помощи отладчика? 


Для этого попробуй использовать цикл "while do".

И еще: мое IMHO, что оптимизатор оключать не стоит. Он умный smile 
И уж точно не стоит работать попеременно (то с включенным, то нет).

Цитата(FaHaT @  5.12.2007,  00:41 Найти цитируемый пост)
Кстати, нет ли у вас ссылки или книги где можно узнать поподробнее о работе оптимизатора ?


К сожалению нет. 
Я бы и сама с большим удовольствием ее почитала smile 
PM MAIL   Вверх
FaHaT
Дата 5.12.2007, 01:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 3.12.2007

Репутация: нет
Всего: нет



Цитата(Riply @  5.12.2007,  01:33 Найти цитируемый пост)
И уж точно не стоит работать попеременно (то с включенным, то нет).


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

PM MAIL ICQ   Вверх
Riply
Дата 5.12.2007, 01:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Комодератор
Сообщений: 572
Регистрация: 27.3.2007
Где: St. Petersburg

Репутация: 3
Всего: 32



Цитата(FaHaT @  5.12.2007,  01:42 Найти цитируемый пост)
почему же не стоит, допустим в процессе отладки программы, отключил, а уже на этапе конечной компиляции включить, чтобы так сказать оптимизировать код =)


И получить совершенно другой, новый код,
а не тот который ты отладил и в котором выловил все баги smile 

PM MAIL   Вверх
FaHaT
Дата 5.12.2007, 02:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 3.12.2007

Репутация: нет
Всего: нет



Цитата(Riply @  5.12.2007,  01:49 Найти цитируемый пост)
И получить совершенно другой, новый код,


я бы не сказал что он будет "совершенно другой" возможно какие то различия будут в самом коде, хотя сомневаюсь, но уж точно те баги которые я исправил останутся исправленными. Так что имхо перед отладкой с помощью дебагера стоит отключить оптимизацию, а после окончания отладки можна снова её включить.


Это сообщение отредактировал(а) FaHaT - 5.12.2007, 02:14
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0878 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.