3

D2010 を使用して、次のようなことをしたいと思います。

procedure SizeArray(var aArr: array of integer; aSize: integer);
begin
  SetLength(aArr,aSize);
end;

しかし、これはコンパイルに失敗します。私の「aArr」パラメーターは動的配列ではないため、オープン配列パラメーターです。また、 SetLength を呼び出すことはできません。パラメータを強制的に動的配列にする唯一の方法は、次のように型名を付けることです。

type
  TIntArray = array of integer;

procedure SizeArray(var aArr: TIntArray; aSize: integer);
begin
  SetLength(aArr,aSize);
end;

これで、コードがコンパイルされます。ほとんどの場合、正常に動作しますが、これは失敗します。

procedure Test;
var
  a : array of integer;
begin
  SizeArray(a,5);
end;

実際の var パラメーターと正式な var パラメーターの型は同一である必要があり、コンパイラは「整数の配列」と「TIntArray」を同一の型として認識しないためです。

それで、ここに私の質問があります: 呼び出し元が名前付きの型ではなく単純な「整数の配列」を宣言できるように、コンパイラーに var パラメーターをオープン配列ではなく動的配列として識別させる方法はありますか?

前もって感謝します。

4

3 に答える 3

10

Pascal、ひいてはDelphiは、動的配列を含む配列タイプに構造的同等性ではなく名前同等性を使用します。次のように、名前のない型で宣言された変数:

var
  x: array of Integer;

...他のタイプの名前と同等ではない匿名の名前を使用することになります。そのため、エラーが発生します。エラーは役立つ場合があります。たとえば、Kilometersの配列とKilograms-の配列を考えてみましょう。ただし、すべての異なる型の名前を宣言するのは不便な場合がよくあります。

この問題を回避し、安全な型システム内にとどまるために(skamradtが示唆するように、型指定されていないパラメーターを避けるため)、特定の配列形状ごとに同じ名前を使用することをお勧めします。TArray<T>システムユニットで宣言されたタイプを使用することにより、これをかなり大規模に行うことができます。したがって、を使用する代わりにarray of Integer、を使用しますTArray<Integer>

TArray<T>次のように宣言されます:

type
  TArray<T> = array of T;

...したがって、任意の動的配列に名前を付けることができます。

于 2009-10-30T22:07:52.020 に答える
9

これは確かに可能です...型なし変数と一緒にabsoluteキーワードを使用するだけです。

procedure SizeArray(var aArr; aSize: integer);
var
  ActArr : Array of Integer absolute aArr;
begin
  SetLength(ActArr,aSize);
end;

var
  Test : Array of Integer;
begin
  SizeArray(Test,5);
  showMessage(IntTostr(High(Test)));  // -- returns 4
end;
于 2009-10-30T21:55:55.473 に答える
0

いいえ、それを行う方法はありません。これは Pascal 言語仕様の一部であり、変更される可能性はありません。

編集: Skamradt は方法を見つけました。もう一度言います。それを安全に行う方法はありません。

于 2009-10-30T21:35:24.617 に答える