以前我有矩阵数据集设计的静态数组
TMatrix = record
row, column: word; {m columns ,n strings }
Data: array[1..160, 1..160] of real
var
Mymatrix : TMatrix;
begin
Mymatrix.row := 160; - maximum size for row us is 160 for 2 x 2 static design.
Mymatrix.columns := 160; - maximum size for column us is 160 for 2 x 2 static design.
根据目前的设计,我只能在160维160的二维矩阵设计中使用。如果我输入更多数组大小[1..161,1..161],编译器将警告E2100数据类型太大:超过2 GB错误。因此,如果我将代码转换为动态数组,我需要重新构造所有当前代码以从0开始读取矩阵。以前,对于静态数组,数组将从1开始。一些外部函数从1开始读取矩阵。
所以,现在我坚持使用我当前的代码,我需要创建超过一千个N x N矩阵大小。使用我目前的静态阵列设计,如果低于160 x 160,一切都很顺利。因此,我需要获得任何解决方案,而无需过多改变我当前的静态阵列设计。
感谢。
答案 0 :(得分:6)
继续使用基于1的索引会更容易。你可以用几种不同的方式做到这一点。例如:
type
TMatrix = record
private
Data: array of array of Real;
function GetRowCount: Integer;
function GetColCount: Integer;
function GetItem(Row, Col: Integer): Real;
procedure SetItem(Row, Col: Integer; Value: Real);
public
procedure SetSize(RowCount, ColCount: Integer);
property RowCount: Integer read GetRowCount;
property ColCount: Integer read GetColCount;
property Items[Row, Col: Integer]: Real read GetItem write SetItem; default;
end;
function TMatrix.GetRowCount: Integer;
begin
Result := Length(Data)-1;
end;
function TMatrix.GetColCount: Integer;
begin
if Assigned(Data) then
Result := Length(Data[0])-1
else
Result := 0;
end;
procedure TMatrix.SetSize(RowCount, ColCount: Integer);
begin
SetLength(Data, RowCount+1, ColCount+1);
end;
function TMatrix.GetItem(Row, Col: Integer): Real;
begin
Assert(InRange(Row, 1, RowCount));
Assert(InRange(Col, 1, ColCount));
Result := Data[Row, Col];
end;
procedure TMatrix.SetItem(Row, Col: Integer; Value: Real);
begin
Assert(InRange(Row, 1, RowCount));
Assert(InRange(Col, 1, ColCount));
Data[Row, Col] := Value;
end;
这里的技巧是即使动态数组使用基于0的索引,您也只是忽略存储在0索引中的值。如果您从Fortran移植使用基于1的索引的代码,这种方法通常是最有效的。