正确的和最简单的方法可能是定义一个类型:
type
TMatrix3x3 = array [0..2,0..2] of Single;
然后你就可以直接写:
var
v1, v2: TMatrix3x3;
begin
fillchar(v1,sizeof(v1),0);
move(v1,v2,sizeof(v1));
if comparemem(@v1,@v2,sizeof(v1)) then
writeln('equals');
end;
使用sizeof()
使你的代码的安全性和可读性。
你可以定义一个包装类型与方法:如果需要
{ TMatrix3x3 }
type
TMatrix3x3 = record
v: array [0..2,0..2] of Single;
procedure Zero;
procedure Copy(var dest: TMatrix3x3);
procedure Fill(const source: TMatrix3x3);
function Equals(const other: TMatrix3x3): boolean;
end;
procedure TMatrix3x3.Copy(var dest: TMatrix3x3);
begin
move(v,dest,sizeof(v));
end;
function TMatrix3x3.Equals(const other: TMatrix3x3): boolean;
begin
result := CompareMem(@v,@other.v,sizeof(v));
end;
procedure TMatrix3x3.Fill(const source: TMatrix3x3);
begin
move(source,v,sizeof(v));
end;
procedure TMatrix3x3.Zero;
begin
fillchar(v,sizeof(v),0);
end;
包括当时先进的功能,如隐式分配,和运营商。
但是不要重新发明轮子,如果你真的要使用矩阵算术。使用已经存在且经过充分测试的库,这将为您节省很多麻烦和调试时间。
至于现有的图书馆,我怀疑有好的有这样的类型。我知道我已经把我所有的例程都推出了这种类型。 –
答案中增强记录的一些问题。您提出了方法主题的变异方法。这是记录问题。当你在一个const参数中调用这样一个方法时,会导致语义错误。如果内存不可写,甚至运行时错误。记录上没有变异方法。使用返回值的静态类函数。等号运算符在没有不等于的情况下有点无用。此外,二进制比较与浮点比较不同。这是微妙但重要的。 –
此外,您的复制和填充方法可以被删除,并在他们的地方使用':='赋值运算符使用简单的旧的。如果你想设置为零,那么最好的方法是用该值声明一个类型常量并使用赋值。 –