2009-09-16 55 views
2

我大量使用動態數組,並且對SetLength和Finalize過程沒有任何問題。什麼需要在多維動態數組中完成?

我最近有原因使用動態數組,其中每個數組元素本身可能包含可變數量的元素。該聲明是這樣的:

TScheduleArray = array of array of array [1..DaysPerWeek] of TShiftType; 

軟件工作正常,我沒有得到一個問題如何使用這種結構。您可以在主陣列上調用SetLength,然後可以在每個數組元素上再次調用SetLength。這是按預期工作的。

SetLength(MyArray, 1); 
SetLength(MyArray[0], 2); 

我的問題是這樣的:當我來到釋放用於該陣列的資源,我只是叫最後確定的數組變量:

Finalize(MyArray); 

或做每個數組元素也需要成爲Finalize d,因爲每個元素本身就是一個動態數組?

回答

5

數組由編譯器管理,不需要最終確定。如果TShiftType是一個類,你必須手動釋放這些對象,一次一個,但是當它超出範圍時,數組本身將被正確處置。

+0

ah是的,我在Delphi幫助中看到「如果在Finalize調用中指定的變量不包含長字符串,變體或接口,編譯器將消除該調用並且不會生成任何代碼。 TShiftType是一個枚舉類型,所以沒有對象。 因此,所有這一次我已經仔細調用Finalize,編譯器已經消除了電話?! – 2009-09-16 13:24:42

+1

是的!動態數組和記錄是爲您照顧的。 – 2009-09-16 13:32:54

6

報價「你調用SetLength主陣列 ,然後可以在 每個數組元素再次調用SetLength。」

你不需要遍歷你的數組。

SetLength()接受每個維度的長度列表。

實施例:

SetLength(ScheduleArray,200,15,35); 

相同:

SetLength(ScheduleArray,200); 
for i:=low(ScheduleArray) to high(ScheduleArry) do 
begin 
    SetLength(ScheduleArray[i],15); 
    for j:=low(ScheduleArray[i]) to high(ScheduleArray[i]) do 
    SetLength(ScheduleArray[i,j],35); 
end; 
+0

謝謝,這很有用。 – 2009-09-17 08:12:27

+0

雖然這不起作用,如果你的數組不是矩形。 (另外,雖然有趣,但這不是問題的答案。) – 2010-02-22 23:48:52

1

要釋放的任何動態陣列只是把它分配給零 例如:

a:array of array of integer; 

要釋放它使用:

a:=nil;