如何在Delphi中定义包含其他常量记录的常量记录?具体情况:矩阵使用向量

Tro*_*ian 5 delphi constants record delphi-xe2

假设我在一个单元中有一个简单的记录,例如:

TVector2D = record
public
  class function New(const x, y: Accuracy): TVector2D; static;
public
  x, y: Accuracy;
end;
Run Code Online (Sandbox Code Playgroud)

然后我在使用上述记录集构建的同一单元中有第二条记录,例如:

TMatrix3D = record
public
  class function New(const row1, row2, row3: TVector3D): TMatrix3D; static;
public
  Index : array [0..2] of TVector3D;
end;
Run Code Online (Sandbox Code Playgroud)

然后我定义轴方向常数如下:

//Unit vector constants
const
  iHat : TVector3D = (x: 1; y: 0; z: 0);
  jHat : TVector3D = (x: 0; y: 1; z: 0);
  kHat : TVector3D = (x: 0; y: 0; z: 1);
Run Code Online (Sandbox Code Playgroud)

我现在想要使用上面的常量来定义另一个常量,例如:

  identity : TMatrix3D = (row1: iHat; row2: jHat; row3: kHat);
Run Code Online (Sandbox Code Playgroud)

然而,上述尝试不起作用.我将如何在Delphi XE2中执行此操作?

非常感谢您的努力.:-)

Dav*_*nan 12

那是不可能的.在常量记录声明中,成员值必须是常量表达式.也就是说,您不能像尝试那样使用类型化常量.

文件说,像这样的,我的重点:

记录常量

要声明记录常量,请指定每个字段的值 - 作为fieldName:value,字段分配用分号分隔 - 在声明末尾的括号中.值必须由常量表达式表示.

所以你需要像这样声明它:

const
  identity: TMatrix3D = (Index:
    ((x: 1; y: 0; z: 0),
     (x: 0; y: 1; z: 0),
     (x: 0; y: 0; z: 1))
    );
Run Code Online (Sandbox Code Playgroud)

感到沮丧,不得不重复自己,但这是我能怀疑的最好的事情.