1

私は特別な種類の行列を表すクラスを開発しています:

type
  DifRecord = record
    Field: String;
    Number: Byte;
    Value: smallint;
  end;

type
  TData = array of array of MainModule.DataRecord;

type
  TDifference = array of DifRecord;

type
  TFogelMatrix = class
  private
    M: Byte;
    N: Byte;
    Data: ^TData;
    DifVector: ^TDifference;
    procedure init(); 
  public
    constructor Create(Rows, Cols: Byte);
    destructor Destroy;
  end;

コンストラクターで、Data および DiffVector クラス メンバー用にメモリを予約する必要があります。ご覧のとおり、レコードの配列へのポインターを使用します。では、主な質問は、メモリを正しく予約するにはどうすればよいかということです。私はそのようなものを使用することはできないと思います .実行時に必要なだけメモリスペースを予約するという主なアイデアを失っているからです. コメントありがとうございます。
new(Data);
new(DifVector);

4

2 に答える 2

10

動的配列を使用しているarray ofため、SetLength を使用して配列の長さを指定する必要があります。これは動的に行うことができます。

すなわち。このような:

SetLength(Data, 100);

これは 100 バイトを確保しませんが、配列が保持する型の要素を 100 個保持するのに十分なスペースを確保します。

配列の宣言を単純な配列に変更します。

Data: TData;
DifVector: TDifference;

SetLengthでそれを使用すると、うまくいくはずです。

于 2008-11-27T22:29:54.257 に答える
1

また、動的配列型の Delphi 変数はポインタとして格納されることにも注意してください(DotNet の用語では、これを参照型と呼びます)。

この変数をポインターにキャストしない限り、コンパイラーは自分で割り当てを行うことを許可しません。前述の lassevk のように SetLength() を使用する必要があります。

多次元配列 (TData など) を使用すると、SetLength() を 1 回呼び出してすべての次元を設定することで、両方の次元を一度に設定できます。これにより、立方体のような構造になります (各次元の長さは同じです)。ただし、次元内の各インデックスに次の次元とは異なる長さを与えることもできます。2 次元の場合、これは「ジャグ」配列と呼ばれることがあります。

これを行うには、次のように記述します。

SetLength(Data, SizeOfFirstDimension);
for i = 0 to SizeOfFirstDimension - 1 do
  SetLength(Data[i], SizeOfSecondDimensionPerIndex(i));

この例では、「SizeOfSecondDimensionPerIndex」という関数を使用して、2 次元の各配列のサイズを決定していますが、このサイズは任意の方法で決定できます。

ちなみに、レコード タイプの定義には「R」プレフィックスを使用することをお勧めします。私はこれを主要なコーディング スタイル ガイドのいずれにも記載していないことを知っていますが、ポインターの「P」プレフィックス、インターフェイスの「I」プレフィックス、クラス フィールドの「F」プレフィックス、「a」プレフィックスを見ると、引数の場合、定数の場合は 'C' 接頭辞、リソース文字列の場合は 'S' 接頭辞です。このロジックに従って、レコードに 'R' 接頭辞を使用できます。これにより、コードをよりよく理解できるようになりました。

幸運を!

于 2008-11-28T07:58:02.833 に答える