关于变量和程序调试!

SoftWare1999 2001-04-21 01:49:00
我的变量定义如下:
procedure TForm1.Button1Click(Sender: TObject);
var
z,xx,yy:Integer;
i,j,k,m,n:Integer;
begin
fillchar(A,sizeof(A),-1);//A是一个三维数组
form1.Caption:=form1.caption+' '+timetostr(now);
end;

程序通过编译运行。但是在调试过程(Watch与断点)中,发现所定义的xx,yy负值后,从Watch中看到xx:Variable 'xx' inaccessible here due to optimization的字样。yy也是一样。其它变量z,i,j,k,m,n都没有问题。??

xx,yy改为x,y或t,u依然!
改变xx,yy定义的顺序依然!
重新启动delphi运行依然!

以前用BPascal调试,从未出现过编译通过了,却观察不到变量。
这难道是Delphi的Bug?!或许我说的不对!

但是,谁能告诉我这是怎么回事?
附:我的工作环境Winme+Delphi4.0

另外,在delphi中怎么保存调试程序时,Watch中加入的变量。也就是下次打开调试时,不必再次输入!

谢谢!
...全文
591 38 打赏 收藏 转发到动态 举报
写回复
用AI写文章
38 条回复
切换为时间正序
请发表友善的回复…
发表回复
SoftWare1999 2001-05-05
  • 打赏
  • 举报
回复
警告在Delphi 1.0 中,允许对控制变量赋值;而从Delphi 2.0 开始,不再允许对控制变量赋值,因为32 位编译器对循环进行了优化。

今天看书,书中这一句话可能是我问题的解答!但是书中没有展开来讲!
如果你在某处看到此具体解答,请告诉我!
SoftWare1999 2001-04-27
  • 打赏
  • 举报
回复
to 3nt
试过了,没用!确确实实是Delphi优化的结果。

谁能推荐一本书呢?
3nt 2001-04-27
  • 打赏
  • 举报
回复
把*.cfg *.dof *.dcu 和所有的临时文件删掉试试。
zjting 2001-04-27
  • 打赏
  • 举报
回复
关注!
SoftWare1999 2001-04-27
  • 打赏
  • 举报
回复
是不是要下结论为Delphi优化的Bug?
可惜我的《Object Pascal》一书关于代码优化一章没有,不能解释我的问题?

推荐一本书吧!
clacklin 2001-04-27
  • 打赏
  • 举报
回复
嘿,我经常碰到一些莫名其妙的问题,如:
for i:=0 to iCount do .....;//iCount:=5
运行时却发现i是从5减少到0,让我无可奈何,不知从何说起!!!
ronggang 2001-04-27
  • 打赏
  • 举报
回复
我看不懂,真的没有高手了吗。请回答啊。
SoftWare1999 2001-04-22
  • 打赏
  • 举报
回复
to everyone
希望有人告诉delphi优化的原理,或介绍一本书,我自己看,好吗?
SoftWare1999 2001-04-22
  • 打赏
  • 举报
回复
to clacklin
如果是这样能否从CPU的窗口中体现出来呢?
clacklin 2001-04-22
  • 打赏
  • 举报
回复
delphi对局部变量的优化是这样的,即使在同一过程在,当你用到哪里,它的作用期就到那里,过了之后就没了,而全局变量则是全程有效的。如:
procedure tform1.temp;
var
i:integer;
begin
i:=1;
caption:=inttostr(i);//这时i仍有效.
{...}//这以后就没用到i了,这时watch就看不到了。已被代码优化了。不再占用资源了。
end;
SoftWare1999 2001-04-22
  • 打赏
  • 举报
回复
“我是指那些只在个别过程中使用的单元或全局变量。”
是的,我同意你的说法!

有人说是鸡?我看象兔,这个图标和什么有关!

to everyone
如果你进来看过了,请给出你的看法!
qkl 2001-04-22
  • 打赏
  • 举报
回复
我是指那些只在个别过程中使用的单元或全局变量。
我前面讨论的只是针对我遇到的情况讨论,没有有意针对你的意思,如让你误解请原谅。
另有一无关的问题想问:你的生肖动物是哪种动物,我看不明白?(好奇而已 ;-))
SoftWare1999 2001-04-22
  • 打赏
  • 举报
回复
还有就是你用的方法,只是我特讨厌临时外部变量
~~~~~~~~~~~~是指什么?那应该怎么办?

我觉得我从dos环境的Bpascal做了四年,应该对过程的细分还是比较注意的,
应该不会造成庞大、复杂而混乱的情况!
四年前做的东西,我现在也不会花很多的时间就能读懂!(以前我还没有加注释的习惯)
qkl 2001-04-22
  • 打赏
  • 举报
回复
专门关于delphi优化的原理的书我未发现过的。
关于你说的“如果我把变量都定义成全局变量(我现在就是这样做的)程序运行无误...”我也遇到过的,当时我的过程长而复杂,且使用了数个过程内嵌函数,在主过程的某个 for语句 发现了类似的问题,我在CPU窗中观察到 i(for变量) 的值的确古怪,没办法(我不能向 Borland 求助),我用 while ... Inc(i) 来实现(因为我觉得是 for 将 i 优化时的问题,她用谋寄存器存放 i,而在循环中有众多的地方使用了该寄存器,so...。不好意思是我想当然的看法而已,见笑了),OK了;另一方法,将 for ... end 独立到另一函数去;还有就是你用的方法,只是我特讨厌临时外部变量 ;-)
如果果真这样,当然是Delphi编译器的 Bug 。但反观我那过于庞大、复杂而显混乱的过程,我倒觉得我应付大部分责任。
SoftWare1999 2001-04-21
  • 打赏
  • 举报
回复
to qkl
我是用了四年的Bp后,转向Windows编程用Delphi。
所以我确实不懂Delphi自动优化代码的原理!
Bpascal也确实没有Delphi这么优化代码!

但是,如果我把变量都定义成全局变量(我现在就是这样做的)程序运行无误!
我再把变量定义成局部变量后,程序得不出正确答案。
你说这是Delphi代码优化的Bug,还是我的程序的Bug!
SoftWare1999 2001-04-21
  • 打赏
  • 举报
回复
to Kingron
我是这样引用的
for k:=1 to 20 do
for n:=1 to 20-i+1 do begin
m:=n+k-1;
for x:=n to m-1 do
~~~就是此变量找不到!
…………
end;
不知道这样是不是等于没有用!
qkl 2001-04-21
  • 打赏
  • 举报
回复
其实你对Delphi自动优化代码不是很明白。
Delphi自动优化代码功能也是有限制的,她只会帮你优化局部变量。
我没用过Bpascal,但我想大概是Bpascal没有这样优化代码罢了。
Delphi函数局部变量是存放在栈中的(不包括类对象),类对象统统在堆中分配。
Kingron 2001-04-21
  • 打赏
  • 举报
回复
你怎么使用的?不要说i:=i+1这样的没有用的。最好是showmessage(inttostr(i))这样就不会被优化掉了。
WuHeHai 2001-04-21
  • 打赏
  • 举报
回复
关注!
SoftWare1999 2001-04-21
  • 打赏
  • 举报
回复
我知道Delphi能自动优化代码!
但是我实实在在的使用了他!

还有当我定义的全局变量时,可以Watch到!

我想可能还是要从这个方面分析!
在delphi中的局部变量和Bpascal中的局部变量,有什么不同?
如:是否是在调用该函数时,分配空间………………
加载更多回复(18)

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧