delphi的bug!?请高手来看!(75分)

  • 主题发起人 主题发起人 czonghui
  • 开始时间 开始时间
C

czonghui

Unregistered / Unconfirmed
GUEST, unregistred user!

本人编写的代码使用(delphi5.0),对string进行操作:
procedure TForm1.BtnOriginClick(Sender: TObject);
var
tmpStr1,tmpStr2,tmpStr3,tmpStr4:string;
sec:int64

begin
sec:=0;
//从ListBox中的第一行取出String的值
//该String是使用CoCreateGuid()函数生成的GUID
tmpStr1:=lbxResult.Items.Strings[0];
//从String中一定位置读出字符,由于GUID每一位字符都在0-9,a-f之内
//即在16进制数的表示范围之内
tmpStr2:=Copy(tmpStr1,2,1);
tmpStr3:=Copy(tmpStr1,4,1);
tmpStr4:=Concat(tmpStr2,tmpStr3);
tmpStr4:=TrimLeft(tmpStr4);
//转换后的tmpStr4的每一位字符都在0-9,a-f之内,在16进制数的表示范围之内
tmpStr4:='$'+tmpStr4;
//将tmpStr4用字符串表示的16进制数转换成整数
sec:=StrToInt64(tmpStr4);//不出现正确的结果!!!
sec:=88-sec;
end;
代码的实际运行情况是第一行(sec:=0;)和最后1行(sec:=88-sec;)不执行,也加不上断点。
倒数第二行执行(sec:=StrToInt64(tmpStr4);),但不出正确的结果,结果总显示0(单布调试显示
sec的结果还是0).
以上代码是程序的一部分,程序中有两处代码使用了类似的算法StrToInt64(),一处正常,另一处
(就是以上代码)却不能出现正确的结果。两处代码结构完全相同,只是变量名称不同。将程序重新
编译、重启计算机,将代码移植到delphi4.0,改变变量的名称,,使用StrToInt()代替StrToInt64()
等都没有任何效果。
本人对tmpStr4直接赋值,例如tmpStr:='$4A';程序可以出现正确的结果。这是不是delphi的bug?
请问各位专家,这是什么原因,如何解决?以上代码有什么问题?
 
这两句后面都没有 sec 作为右值的, 所以编译器优化掉了。
问题不太清楚。
 
在 sec := 88 - sec
后面
加上一句 capiton := inttostr(sec);
或者在过程begin后面
加上{$O-} // 表示关闭优化编译

这样可以在断点处进行跟踪.
 
在两句给局部变量赋值的语句中间,如果这个局部变量没有使用过,那么第一条赋值
语句就会被优化掉,给局部变量赋值之后,如果不再使用这个局部变量,也会被优化
掉,按照这两条规则相信你该知道怎么办了。
 
delphi 偶尔出现一些无法解释的问题。
您可以试一下,将变量sec声明
为全局变量,在FormCreate中促使化.
这种办法常会解决一些怪问题。
 
多人接受答案了。
 
后退
顶部