如何初始化一个静态数组?
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 语言太久了。以上是关于如何初始化一个静态数组?的主要内容,如果未能解决你的问题,请参考以下文章