如何初始化一个静态数组?

Posted

技术标签:

【中文标题】如何初始化一个静态数组?【英文标题】:How to initialize a static array? 【发布时间】:2011-07-12 16:48:16 【问题描述】:

假设我有这个声明:

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

如何使用这样的常量声明将 R2 初始化为零:

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

这与Record in record (Cannot initialize)有关

【问题讨论】:

类型声明使用=,而不是:。那是类型还是变量声明?在您之前的问题中,您听起来应该是记录的一个字段。请澄清。 对不起。我已经更新了问题。 【参考方案1】:

省略要归零的字段:

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' 文档。

【讨论】:

谢谢。有用。我只是希望它不是在未来版本的 Delphi 中不再适用的“黑客”。【参考方案2】:

您可以使用此方法将数组初始化为零

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

或者这个

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

【讨论】:

为什么 FillChar 不安全?只是 FillChar 数组,而不是整个记录,它是完全安全的。 FillChar 仅对不可“blittable”的类型不安全,即需要特殊处理的类型,如字符串、接口、变体等。 是的,我完全同意 rudy 使用 FillChar 是不安全的,因为它太容易出错。如果我在没有字符串(“安全”)的记录数组上使用它,然后下一个程序员将​​字符串添加到记录中怎么办?此外,很容易将 length() 与 SizeOf() 混淆。 @RudyVelthuis - 见 GuyGordon 的评论。这就是为什么:) :) :) 几乎每一行代码都可能出错。不使用低级程序并不是一个很好的理由。 FillChar 并不比 ZeroMemory 更不安全。【参考方案3】:

您可以声明一个R2 类型的常量并将其初始化为全零,如下所示:

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

数组长度为 1024,因此您必须在该列表中指定所有 1024 个逗号分隔值。

【讨论】:

如果我设置的值较少,则会出现错误“:E2072 元素数 (3) 与声明 (1024) 不同”。 @Rob:您必须准确指定 1024 个值。这就是这些 const 的工作原理。 认真的吗?抱歉,我想我用 C 语言太久了。

以上是关于如何初始化一个静态数组?的主要内容,如果未能解决你的问题,请参考以下文章

C++ 如何将一个静态结构体数组初始化?

初始化稀疏静态数组

如何在可配置计数的静态结构数组中初始化具有特定值的成员? [复制]

如何将静态数组初始化为 C++ 函数中的某个值?

如何在 gcc 中静态初始化 __m128i 数组?

初始化静态 const char* 数组