2012-09-14 53 views
0

由於某種原因,如果變量是在'Private'(他們需要限制本單元內的訪問)下定義的,我正在整理一些我已經給出的代碼。寫入時遇到EAccessViolation錯誤。如果我在實現前在Var下輕鬆定義它們,則可以正確訪問它們。我將我的結構與其他類似單位進行比較,其中私人單位工作正常&無法找到任何重大差異。有什麼建議嗎?EAccessviolation AV Error使用Private中的變量

錯誤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; 

調用函數(添加到郵政大衛H公司的第一個問題之後):

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

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

您必須這樣做才能在釋放對象時調用析構函數。

+0

嗨大衛,感謝您的快速響應,關於檢查調用代碼的好點,儘管我的結構與您的測試fn非常相似,(我已將調用函數添加到原始問題中)。關於創建/刪除語法的好點,我會整理起來,看看它是否運行 – SolarBrian

+0

hmm,還沒有雪茄,問題發生與&fulldrug模式和mem漏洞報告fastmm4 – SolarBrian

+0

問題中的代碼是不是真正的碼。該代碼不會產生訪問衝突。請發佈展示您描述的行爲的真實代碼。 –