代码之家  ›  专栏  ›  技术社区  ›  Vegar

Delphi:分配给全局记录-全局记录不变

  •  2
  • Vegar  · 技术社区  · 14 年前

    在Delphi单元中,我有一个称为“context”的全局记录:

    interface
      type
        TContext = record
           ...
        end;
    
      var
        context: TContext;
    

    我在这个单元中也有一个初始化过程,采用一个上下文:

    interface  
      procedure Init(AContext: TContext);
    

    在init过程中,我尝试将给定的上下文分配给全局上下文:

    implementation
      procedure Init(AContext: TContext);
      begin
        context := AContext;
      end;
    

    由于某种原因,全局上下文在分配后保持为空。为什么会这样? 在过程中声明一个局部变量,并按预期分配给它。


    我应该提到的是,这个单元位于一个dll中,init过程是从exe调用的。 声明一个全局记录或声明几个全局字符串没有什么区别。指定的值将丢失。

    当做,
    -维加尔

    3 回复  |  直到 14 年前
        1
  •  3
  •   Uli Gerhardt    14 年前

    我想你得再显示一点代码。用

    unit Unit1;
    
    interface
    
    type
      TContext = record
        dummy: Integer;
      end;
    
    var
      context: TContext;
    
    procedure Init(AContext: TContext);
    
    implementation
    
    procedure Init(AContext: TContext);
    begin
      context := AContext;
    end;
    
    end.
    

    program Project1;
    
    {$APPTYPE CONSOLE}
    
    uses
      Unit1 in 'Unit1.pas';
    
    procedure Test;
    var
      c: TContext;
    begin
      c.dummy := 666;
      Init(c);
    end;
    
    begin
      Test;
    end.
    

    我得到了预期的结果,即 c Unit1.context 执行后都包含666 Init(c); 在里面 Test .

        2
  •  0
  •   Vegar    14 年前

    找到错误。一切都是一团糟,真的……结果发现,负责调用init方法的对象存在两次,并且包含全局变量的单元同时存在于dll和exe项目中。出于某种原因,调用类的一个实例操纵了exe中的全局变量,而另一个实例操纵了dll中的全局变量,开发人员和调试人员都被触发到了停止状态…

    代码是一些旧的、混乱的遗留代码的一部分,我们正试图将其分解和清理。我们真的开始掌握“破碎”的窍门…

    谢谢你的回复,很抱歉浪费你的时间。

    当做, -维加尔

        3
  •  -1
  •   DwrCymru    14 年前

    你不应该换吗

    过程初始化(acontext:tcontext);

    过程初始化(var acontext:tcontext);