2011-07-12 164 views
3

我有2條是這樣的:記錄在記錄(無法初始化)

TYPE 
TRecord2= packed record 
    i2: Integer; 
end; 

TRecord1= packed record 
    i1: Integer; 
    R2: TRecord2; 
end; 

我想將記錄字段初始化爲零,但我不想使用FillMemory,因此我聲明瞭2個常量記錄,其中我初始化了這些字段。

CONST 
    Record2c: TRecord2= 
    (
    i2: 0; 
); 

    Record1c: TRecord1= 
    (
    i1: 0; 
    R2: Record2c;  <------- error line 
); 

但是,我不能指定一個Record2c到R2字段。編譯器說:E2029「(」預期,但標識符「Record2c」裏找到

但這個工作(如果我評論,我有錯誤的行):

procedure test; 
var Record1: TRecord1; 
begin 
Record1:= Record1c;  // initialize variable by associating the constant to it 
end 

所以,我如何初始化R2場?

+0

您是否有充分的理由來打包記錄?內存的速度可能會變慢。 – 2011-07-12 16:13:16

+0

該記錄將寫入磁盤。 – Ampere

回答

4

您只能使用常量來初始化常量。真常數沒有類型 - 這些是鍵入的常量。請參閱Delphi文檔中的Declared Constants。你的代碼中的Record2c是一個類型常量,所以它不能用於初始化Record1c所需的常量表達式。你只需要在網上的Record1c.R2定義:

const 
    Record1c: TRecord1 = (
    i1: 0; 
    R2: (i2: 0;); 
); 

當你註釋掉錯誤行,你要離開的R2場默認初始化爲零。

+0

謝謝。這不完全是我所希望的,但它會做到。公認。 – Ampere

+0

另一個問題:如果R2字段將被聲明爲「R2:字節數組[1..1024]」,我如何填充零? – Ampere

+0

這會更好一個單獨的問題:「我如何初始化記錄常量的數組字段?」無論如何,你用一系列值初始化它:'R2:(0,0,0,...)'。任何你不指定的項目將被設置爲零。這隻適用於固定大小的數組;允許動態數組的唯一常量表達式是'nil'。 –

4

這是因爲Record2c類型常數這是不是一個「真正」的常數。所以你不能用它來初始化另一個不變的。你必須申報Record1c

Record1c: TRecord1 = 
    (
    i1: 0; 
    R2: (i2: 0); 
    );