次の関数を使用して、varparamである動的配列の長さを設定しようとしています。コードをコンパイルしようとすると、エラーが発生するだけです。
[dcc64エラー]lolcode.dpr(138):E2008互換性のないタイプ
function execute(var command : array of string) : Boolean;
begin
// Do something
SetLength(command,0);
end;
次の関数を使用して、varparamである動的配列の長さを設定しようとしています。コードをコンパイルしようとすると、エラーが発生するだけです。
[dcc64エラー]lolcode.dpr(138):E2008互換性のないタイプ
function execute(var command : array of string) : Boolean;
begin
// Do something
SetLength(command,0);
end;
あなたは配列パラメータの一般的で根本的な誤解に苦しんでいます。あなたがここに持っているもの:
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;
オープン配列または動的配列パラメーターのどちらを使用するかをどのように選択する必要がありますか?私の意見では、可能であれば常にオープンアレイを使用する必要があります。それが不可能な場合は、最後の手段として動的配列を使用してください。オープン配列パラメーターを持つ関数である理由は、動的配列パラメーターを持つ関数よりも一般的です。たとえば、定数サイズの配列をオープン配列パラメーターとして渡すことはできますが、関数が動的配列を受け取る場合は渡すことができません。
タイプを定義する
type
TStringArray = array of string;
そしてあなたはすることができます
function Execute(var StringArray: TStringArray): boolean;
begin
// Do something
SetLength(StringArray, 0);
end;