[英]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.