Не могу войти в цикл - PullRequest
2 голосов
/ 22 декабря 2011

У меня была странная проблема, которую я никогда раньше не видел. Теперь у меня есть цикл for:

var
 a,counter: byte;
begin
  a:=0; 
   for counter := 1 to 10 do//I put a breakpoint at this line
   begin
     a:=a*5;
     a:=a+counter;
   end;
end;

Если я поставлю точку останова в строке выше и попытаюсь войти в цикл, я не смогу это сделать. Отладчик сразу перешагивает через цикл и переходит к концу. В конце я получаю правильный результат, но не могу следовать за циклом шаг за шагом Я имею в виду, что это простой пример, а не реальная задача. Я просто хочу знать, когда и при каких обстоятельствах это происходит? Я точно помню, как прослеживал все этапы цикла. Я работаю с Delphi 2010.

Ответы [ 3 ]

10 голосов
/ 22 декабря 2011

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

for counter := 1 to 10 do 
  ;

На самом деле, если у вас нет точки останова, цикл также будет удален, поскольку он ничего не делает.У вас проблемы с вашим кодом, и приведенная выше информация не помогает (с использованием переменной a после запуска цикла), вам нужно опубликовать свой реальный код.Этот составленный код очень легко анализировать;проблема в вашем реальном коде может быть такой простой или гораздо более сложной для анализа.

7 голосов
/ 22 декабря 2011

См. Отключение оптимизации имеет значение - в опциях проекта -> Компиляция -> Генерация кода.

3 голосов
/ 23 декабря 2011

В комментарии к ответу Кена Микаил намекнул, что код находится внутри процедуры. Это также было бы разумным предположением, глядя на код.

Итак, если мы настроим тест следующим образом:

Procedure Test;
var
  a,counter: byte;
begin
  a:=0;
  for counter := 1 to 10 do//I put a breakpoint at this line
  begin
    a:=a*5;
    a:=a+counter;
  end;
end;

begin
  Test;
end.

Установить оптимизацию на: Результат - как наблюдал Микаил, переход в цикл невозможен.

Выключить оптимизацию: Результат - возможен переход в цикл, как и предполагалось.

Теперь также примите во внимание вопрос Микаила в ответе Кена: была ли невозможность войти в цикл из-за локальной области действия a.

Кен ответил нет, но дело не в этом:

var
  a : byte; // scope of a is outside of the procedure

Procedure Test;
var
  counter: byte;
begin
  a:=0;
  for counter := 1 to 10 do//I put a breakpoint at this line
  begin
    a:=a*5;
    a:=a+counter;
  end;
end;

begin
  Test;
end.

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

Итак, Айн абсолютно прав в своем ответе. (Протестировано в XE2)

Обновление:

Для включения в цикл есть три возможности:

  1. Отключить оптимизацию.
  2. Объявите a вне вашей локальной области.
  3. Вставить фиктивную операцию, используя a после цикла. Нравится: if (a < counter) then;

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...