没人理我:
谁能解释一下
xx:Variable 'xx' inaccessible here due to optimization
产生的原因和避免的方法!我一定加分!

解决方案 »

  1.   

    i meet  the problem ,too.
    关注
      

  2.   

    FillChar(var X; Count: Integer; Value: Byte)
    value is byte, -1 is invalid.
      

  3.   

    被编译器优化掉了!!!!!
    你使用一下定义的变量即可。
    或者
    project-->project options-->Compiler-->Code Generation-->去掉Optimization即可。
      

  4.   

    你的  z,xx,yy:Integer;
      i,j,k,m,n:Integer;
    过程中都没用到,应该在watch里看不到吧。
    watch里的变量会自动保存的,只要你不删除,就会一直保留。
      

  5.   

    to mrzxc
    我知道用Fillchar并且没有出现问题,value is int64 ,-1有效!谢谢!
    to Kingron & clacklin
    其实我使用了我所定义的变量,要不我定义这么多干什么?只不过我没有贴出来!
    project-->project options-->Compiler-->Code Generation-->去掉Optimization即可。 
    这个方法依然如此,还是xx:Variable 'xx' inaccessible here due to optimization
    我想道理应该是对的!应该是被系统优化掉了!但是我还是不能看到?
    watch里面变量,在我关闭了一个工程,再打开这个工程就没了!
    或者关闭了Delphi,在打开也没了。但是有些在网上下载的程序中,可以见到他调试时,观察到的变量!请问具体在那里设置?附:我定义的变量,主要用于for循环或A数组下标!不知道是不是问题产生的原因!
      

  6.   

    是因为这时你已经离开了该变量的使用范围,比如运行了一个messagebox之后,就会出现这种现象。
      

  7.   

    to clacklin
    有一定道理,但是我想我不是属于这种情况!
    因为其他的变量我都可以看到!
    再者我的调试一直在onClick中,变量应该没有离开范围!局部变量离开定义范围,调试窗口应该显示该变量没有定义才对吧!
      

  8.   

    不是曾经看到过,而是重来就没有看到!
    不管你在什么时候引用,都看不到!不知道为什么!如果把他们全部定义成全局变量,就都可以了!
    并且都付初值0,而局部变量为随机值!问一下,在delphi中的局部变量和Bpascal中的局部变量,有什么不同?
    如:是否是在调用该函数时,分配空间………………我想应该是Delphi把它优化了,但是为什么呢?
    还是局部变量在Delphi中定义,有所限制!?
      

  9.   

    To Kingron:
    使用一下变量可以,但是如果不使用的化,即便是去掉Optimizition也是会出现他所说的问题。
      

  10.   

    to richardsong
    我可是用了该变量的,如果不是用Delphi不是会说'xx' never used……。
    去掉Optimizition应该产生的效果是什么?
      

  11.   

    procedure TForm1.Button2Click(Sender: TObject);
    var
      z,xx,yy:Integer;
      i,j,k,m,n:Integer;
    begin
    //  fillchar(A,sizeof(A),-1);//A是一个三维数组
       k := 2 ;
       ShowMessage(inttostr(k)) ;end;
    这时就可以在Debug窗口中看到K的值了
      

  12.   

    to richardsong
    在这个问题里,K可以用Watch+断点运行看到!
    就算,把K改为xx,也不可能在我的程序中实现,监控因为xx用于循环!
    而且复杂度为O(N^3).
    谢谢!
      

  13.   

    当你打开项目的Optimization选项时,cute Delphi会自动为你优化代码,所有定义了但有从未被使用的变量、函数...编译器会将她们忽略,也就是,生成的最终执行码中没有她们(你可在CPU窗中看到这点),所以当然watch不到她们。
      

  14.   

    我知道Delphi能自动优化代码!
    但是我实实在在的使用了他!还有当我定义的全局变量时,可以Watch到!我想可能还是要从这个方面分析!
    在delphi中的局部变量和Bpascal中的局部变量,有什么不同?
    如:是否是在调用该函数时,分配空间………………
      

  15.   

    你怎么使用的?不要说i:=i+1这样的没有用的。最好是showmessage(inttostr(i))这样就不会被优化掉了。
      

  16.   

    其实你对Delphi自动优化代码不是很明白。
    Delphi自动优化代码功能也是有限制的,她只会帮你优化局部变量。
    我没用过Bpascal,但我想大概是Bpascal没有这样优化代码罢了。
    Delphi函数局部变量是存放在栈中的(不包括类对象),类对象统统在堆中分配。
      

  17.   

    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;
    不知道这样是不是等于没有用!    
      

  18.   

    to qkl
    我是用了四年的Bp后,转向Windows编程用Delphi。
    所以我确实不懂Delphi自动优化代码的原理!
    Bpascal也确实没有Delphi这么优化代码!但是,如果我把变量都定义成全局变量(我现在就是这样做的)程序运行无误!
    我再把变量定义成局部变量后,程序得不出正确答案。
    你说这是Delphi代码优化的Bug,还是我的程序的Bug!
      

  19.   

    to everyone
    希望有人告诉delphi优化的原理,或介绍一本书,我自己看,好吗?
      

  20.   

    专门关于delphi优化的原理的书我未发现过的。
    关于你说的“如果我把变量都定义成全局变量(我现在就是这样做的)程序运行无误...”我也遇到过的,当时我的过程长而复杂,且使用了数个过程内嵌函数,在主过程的某个 for语句 发现了类似的问题,我在CPU窗中观察到 i(for变量) 的值的确古怪,没办法(我不能向 Borland 求助),我用 while ... Inc(i) 来实现(因为我觉得是 for 将 i 优化时的问题,她用谋寄存器存放 i,而在循环中有众多的地方使用了该寄存器,so...。不好意思是我想当然的看法而已,见笑了),OK了;另一方法,将 for ... end 独立到另一函数去;还有就是你用的方法,只是我特讨厌临时外部变量 ;-)
    如果果真这样,当然是Delphi编译器的 Bug 。但反观我那过于庞大、复杂而显混乱的过程,我倒觉得我应付大部分责任。
      

  21.   

    还有就是你用的方法,只是我特讨厌临时外部变量 
                                    ~~~~~~~~~~~~是指什么?那应该怎么办?我觉得我从dos环境的Bpascal做了四年,应该对过程的细分还是比较注意的,
    应该不会造成庞大、复杂而混乱的情况!
    四年前做的东西,我现在也不会花很多的时间就能读懂!(以前我还没有加注释的习惯)
      

  22.   

    “我是指那些只在个别过程中使用的单元或全局变量。”
    是的,我同意你的说法!有人说是鸡?我看象兔,这个图标和什么有关!to everyone
    如果你进来看过了,请给出你的看法!
      

  23.   

    delphi对局部变量的优化是这样的,即使在同一过程在,当你用到哪里,它的作用期就到那里,过了之后就没了,而全局变量则是全程有效的。如:
    procedure tform1.temp;
    var
    i:integer;
    begin
    i:=1;
    caption:=inttostr(i);//这时i仍有效.
    {...}//这以后就没用到i了,这时watch就看不到了。已被代码优化了。不再占用资源了。
    end;
      

  24.   

    to clacklin
    如果是这样能否从CPU的窗口中体现出来呢?
      

  25.   

    嘿,我经常碰到一些莫名其妙的问题,如:
    for i:=0 to iCount do .....;//iCount:=5
    运行时却发现i是从5减少到0,让我无可奈何,不知从何说起!!!
      

  26.   

    是不是要下结论为Delphi优化的Bug?
    可惜我的《Object Pascal》一书关于代码优化一章没有,不能解释我的问题?推荐一本书吧!
      

  27.   

    把*.cfg *.dof *.dcu 和所有的临时文件删掉试试。
      

  28.   

    to 3nt
    试过了,没用!确确实实是Delphi优化的结果。谁能推荐一本书呢?
      

  29.   

    警告在Delphi 1.0 中,允许对控制变量赋值;而从Delphi 2.0 开始,不再允许对控制变量赋值,因为32 位编译器对循环进行了优化。今天看书,书中这一句话可能是我问题的解答!但是书中没有展开来讲!
    如果你在某处看到此具体解答,请告诉我!