微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为在 case 变体中具有数组的记录创建常量

如何解决为在 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 字段和 'vector' v 字段共享相同的内存,您不能为它们单独设置不同的值。对 x、y、z 的更改将反映在 v[0]、v[1] 和 v[2] 中。同样,设置v[0]、v[1]、v[2]会分别影响x、y、z。

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

这是一个变体记录的例子(相当于 C 中的联合)。这种结构的目的是通过在不同时间使用相同的内存区域来存储不同的对象来节省内存。虽然它可以节省内存,但它很容易出现难以检测的错误。在具有严重内存限制(例如几 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));

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。