0

出于某种原因,如果变量是在“私有”下定义的(它们需要在此单元内限制访问),我正在整理我得到的一些代码。我在写信给他们时收到 EAccessViolation 错误。如果我在实现之前在 Var 下松散地定义它们,它们就可以正常访问。我正在将我的结构与其他类似单位进行比较,其中私人单位工作正常,无法发现任何重大差异。有什么建议吗?

错误消息:项目 --- 引发异常类 EAccessViolation 错误,并带有消息“模块中的访问违规错误”----。读取地址 0000050F

interface
uses
  dialogs, math, dateutils, SysUtils, classes;
type
     //double = extended;   
     TDoubleDoubleArray = array of array of double;
     TSunPositionAlgorithm = class (TObject)
         private
           FLocationChanged: boolean;
         public
           Constructor Create;
           Destructor Destroy;
           procedure SetDefaults;
         end;
  Var
    SunPositionAlgorithm : TSunPositionAlgorithm;
           F_L0: Double;
           F_L1: TDoubleDoubleArray;

implementation
  {TSunPositionAlgorithm }

constructor TSunPositionAlgorithm.Create;
begin
  SetDefaults;
end;

procedure TSunPositionAlgorithm.SetDefaults;
Begin
F_L0:= 1;                   // works ok
  FLocationChanged:=true;  // throws eaccess violation error
End;

调用函数(在 David H 的第一个问题后添加到 Post 中):

  procedure TSun.NRELPositionOfSun(const DateTime: TDateTime; var Azimuth, Elevation, Declination: double);
  Var

    LSunPositionAlgorithm : TSunPositionAlgorithm;
  Begin
    LSunPositionAlgorithm := TSunPositionAlgorithm.Create;
    Try
      LSunPositionAlgorithm.SetDefaults;

  blah..


    Finally
      LSunPositionAlgorithm.Destroy;
    End;
  End;
4

1 回答 1

4

您还没有显示调用此代码的代码。但是,很明显您没有有效的TSunPositionAlgorithm对象。

得到这样的一个:

procedure Test;
var
  spa: TSunPositionAlgorithm;
begin
  spa := TSunPositionAlgorithm.Create;
  try
    spa.SetDefaults;
  finally
    spa.Free;
  end;
end;

你可能有这样的代码:

procedure Test;
var
  spa: TSunPositionAlgorithm;
begin
  spa.SetDefaults;//oops, spa has not been initialised yet  
end;

或者可能像这样:

procedure Test;
var
  spa: TSunPositionAlgorithm;
begin
  spa.Create;//oops, spa has not been initialised yet  
end;

更新您现在已经显示了调用代码,但显然还没有全部显示出来,因为问题中的代码没有表现出您描述的行为。我的观点仍然存在,您必须在某处有一个无效的对象引用。我已经展示了几种最常见的实现方式。但是还有其他方法可以获取无效的对象引用。


问题中代码的另一个问题是您的析构函数。它们必须始终标有override指令。

destructor Destroy; override;

您必须这样做才能在释放对象时调用您的析构函数。

于 2012-09-14T10:09:45.697 回答