正確的和最簡單的方法可能是定義一個類型:
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參數中調用這樣一個方法時,會導致語義錯誤。如果內存不可寫,甚至運行時錯誤。記錄上沒有變異方法。使用返回值的靜態類函數。等號運算符在沒有不等於的情況下有點無用。此外,二進制比較與浮點比較不同。這是微妙但重要的。 –
此外,您的複製和填充方法可以被刪除,並在他們的地方使用':='賦值運算符使用簡單的舊的。如果你想設置爲零,那麼最好的方法是用該值聲明一個類型常量並使用賦值。 –