见鬼了,今天用Delphi发生了不可思议的事。 ( 积分: 50 )

  • 主题发起人 主题发起人 qqjm
  • 开始时间 开始时间
Q

qqjm

Unregistered / Unconfirmed
GUEST, unregistred user!
我用的是Delphi 7;

procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
buf:array [0..32] of byte;
begin
for i := 0 to Length(buf) do
begin
buf:= 0;
end;
end;
调试一个循环的时候发现了一个不可思议的事情,于是写了上面一段的代码。

我在循环中加入断点查看i的值,第一次循环时用鼠标指向i,发现i=33,我还以为看错了,于是把i加入Watch List,但还是33。

太神了,我重启了电脑新建了工程再次测试以上的代码,结果还是一样。。。。。。。。。

我可以确定两件事:我没有发烧,电脑没有中毒。

后来我加入了ShowMessage(inttostr(i));发现show出来的值是正确的,鼠标指向i得到的值也是正确的,但是如果我删除了这句,Watch List 中显示的 i的值又是从33开始,每循环一次减1。
晕,这是什么问题。。。。。。。
 
试过了, 完全如LZ所说.........
原因不明 期待楼下解答
 
试着解释一下,不要拿鸡蛋砸我!!
去查查关联的堆栈吧!!
 
Delphi编译程序优化的结果,查一下以前的帖子吧[:(!]
 
编译优化啊,为了让汇编码尽可能的少,所以如果你仅仅是个赋值操作的循环,实际编译会编译成downto的方式,这样产生的汇编码最少。
 
我也遇到过,delphi2007代码是否重新编译的判断有问题,你把duc删了看看
 
删了也不行,是不是编译哭有问题啊,
我记得不久前的一个代码,也是循环,里面加一句codesite1.sendvariant('','')就正确,删了就出错,delphi2007干的事
 
贴上你的代码,第一次执行i=34,是优化编译的结果,不想优化用while do
 
编译器优化了你的代码
尝试这样
var
i : Integer;
begin
i := 1;
end;
看看能不能设置断点
 
應該是優化的結果
 
编译优化,早就领教过了。
 
编译优化,用ShowMessage(IntToStr(i))你会发现值是正确的。
 
我也遇到过,当时也郁闷了很久
 
是优化的结果。不过,
for i := 0 to Length(buf) do
是不是有越界的嫌疑??
应该是Length(buf)-1吧???
 
xpricher没错是Length(buf)-1才对。
 
应该是Delphi编译程序优化的结果,在工程选项里把 Optimization的勾去掉试试
 
暈啊,我還得了個34呢。
 
hight(buf)

for i := low(buf) to high(buf) do
 
代码都写错了,还“神了”,该一下就好了
for i := 0 to Length(buf)-1 do
 

Similar threads

后退
顶部