2011-07-12 195 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); 
    );