内存复制和内存比较Single数组的数组

Jea*_*ond 2 memory delphi compare copy multidimensional-array

在Delphi中,我将一个3x3矩阵表声明为Single数组的数组,如下所示:

m_Table: array [0..2] of array [0..2] of Single;
Run Code Online (Sandbox Code Playgroud)

现在我想将内容与另一个表进行内存比较,或者从另一个表中复制表内容.我知道我可以创建一个嵌套循环来做到这一点,但我希望在没有任何循环的情况下完成这项工作,如果可能的话.

我的问题是,复制或比较这样的内存是正确的:

CompareMem(m_Table, other.m_Table, 9 * SizeOf(Single));
CopyMemory(m_Table, other.m_Table, 9 * SizeOf(Single));
Run Code Online (Sandbox Code Playgroud)

如果没有,这样做的正确方法是什么?

作为一个辅助问题,是否有更好的方法来获取复制长度而不是9*SizeOf(Single),例如SizeOf(m_Table ^)?

问候

Dav*_*nan 5

问题中的代码工作正常.我个人会说这Move是复制记忆的惯用方法.我还会用它SizeOf(m_Table)来获得该类型的大小.

我想指出你的比较与浮点相等运算符不同.也许这就是你想要的,但你应该意识到这一点.例如,使用浮点比较,零和零比较相等,但不与内存比较相比.并且NaN总是比较不相等,即使是相同的位模式.

我还要评论一下,如果你为这些矩阵声明了一个类型,它会使你的代码更加可扩展.如果没有它,您将无法编写接受此类对象的函数.


Arn*_*hez 5

正确和最简单的方法可能是定义类型:

type
  TMatrix3x3 = array [0..2,0..2] of Single;
Run Code Online (Sandbox Code Playgroud)

然后你可以直接写:

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;
Run Code Online (Sandbox Code Playgroud)

使用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;
Run Code Online (Sandbox Code Playgroud)

如果需要,还包括隐式赋值和运算符等高级功能.

但是,如果你真的使用矩阵运算,不要重新发明轮子.使用已经存在且经过全面测试的库,这将为您节省大量的麻烦和调试时间.