为在case变量中包含数组的记录创建常量



我试图为以下记录创建一个常量:

type
point = packed record
case aSInt of
0: (x, y, z: aFloat);
1: (v: array [0 .. 2] of aFloat); { vertex }
end;

我可以声明一个常量来设置前三个变量,如下所示:

const
ZeroPt: Point = (x: 0.0; y: 0.0; z: 0.0);

但是,当我尝试包含数组:

const
ZeroPt: Point = (x: 0.0; y: 0.0; z: 0.0; v:(0.0, 0.0, 0.0));

我得到一个编译错误:'在记录常量字段的顺序不同于声明。

我不知道字段顺序的正确语法。对于正确格式的任何见解,我将不胜感激。

谢谢你,

MFM

这是我从一个朋友那里收到的回复。

由于x, y, z字段和"向量"v字段共享相同的内存,因此不能为它们单独设置不同的值。x, y, z的变化将反映在v[0], v[1]和v[2]中。同样,设置v[0], v[1], v[2]将分别影响x, y, z。

在此记录中,当您想要将一个点作为数组传递/设置而不是单独设置x, y和Z时使用向量字段。从数组中设置坐标也可以更快,并允许使用更简洁的代码。

这是一个变体记录的例子(相当于C中的union)。这种结构的目的是通过在不同时间使用相同的内存区域存储不同的对象来节省内存。虽然它可以节省内存,但它使它非常容易出现难以检测的错误。在有严重内存限制的嵌入式设备上使用它是有意义的(比如几个KB或几个MB)。在桌面应用程序中,最好避免联合/变体记录。

然而,在这个点记录的情况下,它是相当安全的,因为内存完美地对齐单独的坐标x, y, z和v数组。

所以你只需要初始化其中一个。

const
ZeroPt: Point = (x: 0.0; y: 0.0; z: 0.0);

const
ZeroPt: Point = (v:(0.0, 0.0, 0.0));