如何在Delphi中定义包含其他常量记录的常量记录?具体情况:使用向量的矩阵
How to define a constant record containing other constant records in Delphi? Specific case: matrix using vectors
假设我在一个单元有一个简单的记录,比如:
TVector2D = record
public
class function New(const x, y: Accuracy): TVector2D; static;
public
x, y: Accuracy;
end;
然后我在使用上述一组记录构建的同一单元中有第二条记录,例如:
TMatrix3D = record
public
class function New(const row1, row2, row3: TVector3D): TMatrix3D; static;
public
Index : array [0..2] of TVector3D;
end;
然后我定义轴方向常数如下:
//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);
我现在想使用上述常量定义另一个常量,例如:
identity : TMatrix3D = (row1: iHat; row2: jHat; row3: kHat);
但是上面的尝试不起作用。我将如何在 Delphi XE2 中执行此操作?
非常感谢您的努力。 :-)
这不可能。在常量记录声明中,成员值必须是constant expressions。也就是说,您不能像您尝试的那样使用类型化常量。
documentation是这样说的,我强调的是:
Record Constants
To declare a record constant, specify the value of each field - as
fieldName: value, with the field assignments separated by semicolons -
in parentheses at the end of the declaration. The values must be
represented by constant expressions.
所以你需要这样声明:
const
identity: TMatrix3D = (Index:
((x: 1; y: 0; z: 0),
(x: 0; y: 1; z: 0),
(x: 0; y: 0; z: 1))
);
令人沮丧的是不得不重复你自己,但我怀疑这是你能做的最好的了。
假设我在一个单元有一个简单的记录,比如:
TVector2D = record
public
class function New(const x, y: Accuracy): TVector2D; static;
public
x, y: Accuracy;
end;
然后我在使用上述一组记录构建的同一单元中有第二条记录,例如:
TMatrix3D = record
public
class function New(const row1, row2, row3: TVector3D): TMatrix3D; static;
public
Index : array [0..2] of TVector3D;
end;
然后我定义轴方向常数如下:
//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);
我现在想使用上述常量定义另一个常量,例如:
identity : TMatrix3D = (row1: iHat; row2: jHat; row3: kHat);
但是上面的尝试不起作用。我将如何在 Delphi XE2 中执行此操作?
非常感谢您的努力。 :-)
这不可能。在常量记录声明中,成员值必须是constant expressions。也就是说,您不能像您尝试的那样使用类型化常量。
documentation是这样说的,我强调的是:
Record Constants
To declare a record constant, specify the value of each field - as fieldName: value, with the field assignments separated by semicolons - in parentheses at the end of the declaration. The values must be represented by constant expressions.
所以你需要这样声明:
const
identity: TMatrix3D = (Index:
((x: 1; y: 0; z: 0),
(x: 0; y: 1; z: 0),
(x: 0; y: 0; z: 1))
);
令人沮丧的是不得不重复你自己,但我怀疑这是你能做的最好的了。