9

次の関数を使用して、varparamである動的配列の長さを設定しようとしています。コードをコンパイルしようとすると、エラーが発生するだけです。

[dcc64エラー]lolcode.dpr(138):E2008互換性のないタイプ

function execute(var command : array of string) : Boolean;
begin
  // Do something
  SetLength(command,0);
end;
4

2 に答える 2

17

あなたは配列パラメータの一般的で根本的な誤解に苦しんでいます。あなたがここに持っているもの:

function execute(var command: array of string): Boolean;

実際には動的配列ではありません。オープンアレイパラメータです。

これで、動的配列をパラメーターとして、開いている配列を受け取る関数に渡すことができます。ただし、動的配列の長さを変更することはできません。その要素のみを変更できます。

動的配列の長さを変更する必要がある場合、プロシージャは動的配列を受け取る必要があります。現代のDelphiでは、それを書くための慣用的な方法は次のとおりです。

function execute(var command: TArray<string>): Boolean;

ジェネリック配列をサポートしていない古いバージョンのDelphiを使用している場合は、パラメータの型を宣言する必要があります。

type
  TStringArray = array of string;
....
function execute(var command: TStringArray): Boolean;

オープン配列または動的配列パラメーターのどちらを使用するかをどのように選択する必要がありますか?私の意見では、可能であれば常にオープンアレイを使用する必要があります。それが不可能な場合は、最後の手段として動的配列を使用してください。オープン配列パラメーターを持つ関数である理由は、動的配列パラメーターを持つ関数よりも一般的です。たとえば、定数サイズの配列をオープン配列パラメーターとして渡すことはできますが、関数が動的配列を受け取る場合は渡すことができません。

于 2012-10-18T16:15:15.543 に答える
10

タイプを定義する

type
  TStringArray = array of string;

そしてあなたはすることができます

function Execute(var StringArray: TStringArray): boolean;
begin
  // Do something
  SetLength(StringArray, 0);
end;
于 2012-10-18T16:03:27.647 に答える