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

Delphi:分配给全局记录-全局记录不';不变,delphi,variable-assignment,record,Delphi,Variable Assignment,Record,在delphi单元中,我有一个名为“Context”的全局记录: interface type TContext = record ... end; var context: TContext; 我在本单元中还有一个初始化过程,以上下文为例: interface procedure Init(AContext: TContext); 在Init过程中,我尝试将给定上下文分配给全局上下文: implementation procedu

在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调用的。 声明一个全局记录,或声明几个全局字符串没有区别。指定的值丢失

问候,

-Vegar

我想您需要显示更多的代码。与

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.

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

中的code>是否不应更改

过程初始化(AContext:TContext)


过程初始化(Var-AContext:TContext)

发现错误。一切都是一团糟真的。。。。事实证明,负责调用init方法的对象存在两次,包含全局变量的单元同时存在于dll和exe项目中。出于某种原因,调用类的一个实例操作了exe中的全局变量,另一个实例操作了dll中的全局变量,开发人员和调试器都在其中停了下来

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

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

问候,,
-Vegar

如果按住ctrl键并单击过程“Init”中的“context”,IDE应将您带到相关上下文。关于更新:IIUC,“丢失”的值是字符串。混合字符串和DLL总是很棘手的。您是否使用ShareMem、FastMM或类似的工具?您还没有演示如何在EXE中调用该函数。EXE端的函数声明是什么样子的?不是,因为他在
Init
中读取文本。但是
const
(而不是
var
)可能是个好主意。他说他想改变全局var上下文,但当使用局部var时,它是正确的。他说他想改变全局变量,
context
。您没有看到在代码中使用
AContext
参数为全局
context
变量指定新值吗?
AContext
参数不是问题所在。因此,我们可能需要看看本地变量是如何分配的,因为这似乎是可行的。声明var参数实际上会更改“指针”(或内存位置)以反映新值,但不会更改任何原始值。否!赋值是按位复制,有或没有
var
。不同之处在于,
var
AContext是对传递给Init的内容的引用。如果没有,它是一个副本。我总是发现很难决定需要多少代码来说明问题。张贴完整的图片很少是一种选择。啊。。。显然,应该是42,而不是666!:D这很无聊-每个人都使用42.:-)
program Project1;

{$APPTYPE CONSOLE}

uses
  Unit1 in 'Unit1.pas';

procedure Test;
var
  c: TContext;
begin
  c.dummy := 666;
  Init(c);
end;

begin
  Test;
end.