簡體   English   中英

EAccessviolation AV錯誤在專用中使用變量

[英]EAccessviolation AV Error using variables in Private

我正在整理一些代碼,由於某些原因,如果變量在“ Private”下定義(它們必須限制該單元內的訪問),則我會整理代碼。 寫入它們時出現EAccessViolation錯誤。 如果我在實現之前在Var下松散地定義它們,則可以正常訪問它們。 我正在將自己的結構與其他類似的單元進行比較,在這些類似的單元中,私有單元可以正常工作並且不能發現任何重大差異。

錯誤MSG:項目---引發了異常類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;

您尚未顯示調用此代碼的代碼。 但是,很明顯,您沒有有效的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;

您必須執行此操作,以便在釋放對象時調用析構函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM