1

以前、私はマトリックスデータセットデザイン用の静的配列を持っていました

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.

現在の設計では、2次元マトリックス設計で160x160しか使用できません。より多くの配列サイズ[1..161、1..161]を入力すると、コンパイラはE2100データ型が大きすぎることを警告します:2GBを超えるエラー。したがって、コードを動的配列に変換する場合、0から始まる行列を読み取るために、現在のすべてのコードを再構築する必要があります。以前は、静的配列の場合、配列は1から始まります。一部の外部関数は、1から行列の読み取りを開始します。

だから、今私は私が千以上のNxN行列サイズを作成する必要がある私の現在のコードで立ち往生しています。私の現在の静的アレイ設計では、160x160未満であればすべてうまくいきました。したがって、現在の静的アレイの設計を変更することなく、ソリューションを入手する必要があります。

ありがとう。

4

1 に答える 1

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インデックスに格納されている値を単に無視することです。1ベースの索引付けを使用するFortranからコードを移植する場合は、通常、このアプローチが最も効果的です。

于 2012-10-21T18:51:46.287 に答える