2011-07-12 144 views
4

比方說,我有這樣的聲明:如何初始化靜態數組?

TYPE 
RDisk= packed record 
    R2: array[1..1024] of Byte; 
    etc 
    etc 
    end; 

如何使用常量聲明中這樣初始化R2爲零:

CONST 
Disk: RDisk= 
    (
    R: ?? 
    ); 

這與Record in record (Cannot initialize)

+1

類型聲明使用'=',而不是':'。這是一個類型還是變量聲明?在你之前的問題中,你聽起來像是應該是一個記錄領域。請澄清。 –

+0

對不起。我已經更新了這個問題。 – Ampere

回答

4

省略你想要的字段爲零:

type 
RDisk= packed record 
    R2: array[1..512] of Byte; 
    I: Integer; 
    D: Double; 
    R3: array[1..512] of Byte; 
    end; 

const 
Disk: RDisk= 
    (
    I: 3; 
    D: 2.5; 
    ); 

,或者

const 
Disk: RDisk= 
    (
    ); 


我不知道爲什麼它的工作原理,它不太適合在Record Constants'文檔。

+1

謝謝。有用。我只是希望這不是在未來版本的Delphi中不再適用的'黑客'。 – Ampere

+0

@Altar,的確!剛剛測試過BTW,它甚至可以在D3中工作。 –

3

可以初始化使用此零點陣列

ZeroMemory(@R2[0],length(R2)); 

或本

FillChar(R2[0],length(R2),0); 
+1

爲什麼FillChar不安全?只是FillChar陣列,而不是整個記錄,它是完全安全的。 FillChar對於不是「blittable」的類型只是不安全的,即需要特殊處理的類型,如字符串,接口,變體等。 –

+0

是的,我完全同意rudy – opc0de

+4

FillChar的使用是不安全的,因爲它太容易犯錯誤。如果我在沒有字符串(「安全」)的記錄數組上使用它,然後下一個程序員將​​字符串添加到記錄中,該怎麼辦?此外,還有一個很容易讓SizeOf()與length()混淆的錯誤。 –

3

你可以聲明R2類型的常數,它初始化爲這樣的全零:

const 
    zeros: R2 = (0, 0, 0, ...); 

數組長度爲1024,所以您必須指定所有1024逗號分隔值在那個列表中。

+3

如果我設置較少的值,則出現錯誤「:E2072元素數(3)與聲明(1024)不同」。 –

+0

是的。這也是我的問題。 – Ampere

+1

@Rob:你必須指定正好1024個值。這就是那些常量的工作原理。 –