【问题标题】:Record in record (Cannot initialize)记录中的记录(无法初始化)
【发布时间】:2011-07-12 15:53:51
【问题描述】:

我有 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 字段?

【问题讨论】:

  • 你有充分的理由打包唱片吗?那样的话内存可能会变慢。
  • 该记录将被写入磁盘。

标签: delphi


【解决方案1】:

你只能用真正的常量来初始化常量。真正的常量没有类型——那些是类型化的常量。请参阅 Delphi 文档中的 Declared Constants。代码中的Record2c 是一个类型化常量,因此它不能用于像初始化Record1c 所需的常量表达式。你只需要内联Record1c.R2的定义:

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

当您注释掉错误行时,您会将 R2 字段默认初始化为零。

【讨论】:

  • 谢谢。这并不完全是我所希望的,但它会做到的。接受。
  • 还有一个问题:如果 R2 文件会这样声明“R2: array[1..1024] of Byte”,我该如何用零填充它?
  • 作为一个单独的问题会更好:“如何初始化记录常量的数组字段?”不管怎样,你用一个值列表来初始化它:R2: (0, 0, 0, ...)。您未指定的任何项目都将设置为零。这只适用于固定大小的数组;动态数组唯一允许的常量表达式是nil
  • 添加为新问题:*.com/questions/6667907/…
【解决方案2】:

这是因为Record2c 是一个类型化 常量,它不是“真正的”常量。所以你不能用它来初始化另一个常量。你必须声明Record1clike

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

【讨论】:

    【解决方案3】:

    在 Delphi-2009 及更高版本中,可以通过 Default 调用将记录归零。

    record1 := Default(TRecord1);  // This will zero record1 including R2
    

    请参阅David's answer 问题How to properly free records that contain various types in Delphi at once?

    【讨论】: