你们说这个算不算Delphi6的BUG呢!?:)^_^(10分)

  • 主题发起人 主题发起人 rainsea
  • 开始时间 开始时间
R

rainsea

Unregistered / Unconfirmed
GUEST, unregistred user!
前些天,遇到这样的代码。
var I: Integer;
begin
for i:=0 to stringlistx.count - 1do
begin
end;
end;
总是和我的愿望想反,执行起来也没有错误。后来发现,I竟然倒着来,倒!
比如count是10,那I的首值是10,然后每循环一次减一。
好象所有复合结构的数据循环都这样。
后来没办法,这类的循环就都用while了。
各位,你们说这算不算delphi6的bug呢?呵呵。
 
看你begin
end 中间是不是对I进行赋值了?
 
不可能吧,你是不是用了多线程没同步.
 
贴出完整的看看!
 
检查你的变量是怎样定义的,还有begin
...end之间的代码是怎样的
 
优化了!正常!你要说Bug也可以!(被你看到了内部的优化算法)
 
@_@ 肯定是见鬼了... // btw:for中的变量i是不能够改变的.
 
好像在循环体内如果没有引用i则,编译器会自动优化,i由n到0!
优化关了就行了!(不过管他I是几,正确就行,而且还快)
 
这时Delphi优化的结果, 由于你在内部没有使用I, 所以他给优化了.
你如果在循环内部加一个比如MessageBox(IntToStr(I)), 他保证按顺序来
 
哎!说什么你们才相信?
这么多年了,我写程序是特别注意这些细节的。
当然,这个事情的原因确实和delphi的优化有关。
但我把优化关掉后,问题还在。虽然while解决问题了。
但我很想找到根本的原因。
var I: Integer;
begin
for i:=0 to stringlistx.count - 1do
begin
……
end;
end;
这当然是例子了,就这样无论在里面写什么,或不写都是循环倒着来。
 
一般地, 如果你在循环内没有对循环变量进行引用,系统会将其优化!
汇编里可以先给cx计数寄存器赋值(10)!然后再loop!
而如果给cx赋(1)! 至少要先判断一下是不是大于10!再自加1!再jmp!
(大概就是这样优化的)
-----------------------
不过把优化关了应该好了呀!(也有可能不行,我也不知道为什么!有人行,有人不行)
tseug兄说的你试了没!肯定没错的!
比如加个Edit1.Text:=Edit1.Text + inttostr(I);(我试过了)
 
如果还不行,我就不知道了!不好意思!
 
不但delphi6有这样的问题,delphi5也有,不过这是在用delphi ide进行debug的时候
才会有。实际运行时不会有问题的。
 
我柑橘是不是那个-1在后边引起的问题,
试试
var I: Integer;
begin
for i:=0 to (stringlistx.count - 1)do
begin
……
end;
end;
或者
var I,k: Integer;
begin
k:=stringlistx.count - 1;
for i:=0 to kdo
begin
……
end;
end;
 
delphi自作聪明!
windows中类似的东东也有好多。
 
在你的循环体中对I做一下引用看看(就是说把 I 的值赋给别的变量),如果它还是从10往下减,Delphi就该扔垃圾堆里了。
 
Borland新闻?
http://www.delphibbs.com/delphibbs/dispq.asp?lid=755274
 
是这样的,Delphi对Win32优化的结果,如果可以关掉这个功能的
 
谢谢光临!
问了Borland专家后,告诉这个确实是Delphi的一个Bug。
 
多人接受答案了。
 
后退
顶部