1

是否可以将动态数组作为可选参数传递给函数或过程?如果是,如何?

我试过这样:

procedure testp (str : string; var arr : StringArray = nil);
begin
    str := 'Ciao Alessio !';
    SetLength(arr, 2);
    arr[0] := 'Ale';
    arr[1] := 'Ale';
end;

但它给出了:default parameter 'arr' must be by-value or const

我正在使用 Delphi 7,但如果不能使用 Delphi 7,是否可以使用较新版本的 Delphi 或 Free Pascal?

4

2 回答 2

4

只能为 const 或按值参数指定默认参数。不能为 var 参数指定它们。

为了实现您正在寻找的调用者灵活性,您需要使用重载。

procedure foo(var arr: StringArray); overload;
begin
  .... do stuff
end;

procedure foo; overload;
var
  arr: StringArray;
begin
  foo(arr);
end;
于 2013-10-10T14:06:58.920 回答
1

错误消息的意思与它所说的完全一样,它与参数是动态数组无关。无论参数具有什么类型,编译器都会拒绝该代码,因为不允许您为通过引用传递的参数提供默认值。

要制作可选的引用参数,请使用重载来提供函数的两个版本。按照编译器的建议,更改当前函数以通过值或 const 接收其参数,然后声明另一个没有该参数的函数,如下所示:

procedure testp (str : string);
var
  arr: StringArray;
begin
  testp(str, arr);
end;

也就是说,声明一个虚拟参数并将其传递给“真实”函数。然后简单地丢弃它返回的值。

如果参考值的计算成本很高,那么单参数版本的实现testp将改为从双参数版本中复制更多代码。

于 2013-10-10T14:08:52.463 回答