无法进入for循环

时间:2011-12-22 13:36:11

标签: delphi debugging for-loop

我遇到了一个我以前从未见过的奇怪问题。现在我有一个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 个答案:

答案 0 :(得分:10)

循环中的两行代码都可以完全优化掉;你在循环之外对a什么都不做,所以两个分配都是不必要的。优化后,编译器将离开

for counter := 1 to 10 do 
  ;

实际上,如果你那里没有断点,那么循环也会被删除,因为它什么也没做。

如果您的代码出现问题,并且上述信息无效(在循环运行后使用变量a),则需要发布您的实际代码。这个组成的代码非常清晰可分析;实际代码中的问题可能很简单,或者分析起来要复杂得多。

答案 1 :(得分:7)

请参阅关闭优化是否有所不同 - 在项目选项中 - >编译 - >代码生成。

答案 2 :(得分:3)

在对Ken的回答的评论中,Mikayil暗示代码在程序中。 这也是查看代码的合理假设。

所以如果我们设置这样的测试:

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.

设置优化:结果 - 正如Mikayil所观察到的那样,没有可能进入循环。

设置优化关闭:结果 - 可以进入循环,就像建议的那样。

现在还要考虑到Mikayil在Ken的回答中提出的问题: 是否无法进入循环是因为a的本地范围。

Ken回答否,但事实并非如此:

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;
  4. 这些步骤都不是不常见的调试程序,我发现这个问题都是关于。