是否可以将动态数组作为可选参数传递给函数或过程?如果是,怎么样?
我试过这样的方式:
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?
答案 0 :(得分:3)
默认参数只能为const或value参数指定。它们不能指定为var参数。
为了达到调用者的灵活性,您需要使用重载。
procedure foo(var arr: StringArray); overload;
begin
.... do stuff
end;
procedure foo; overload;
var
arr: StringArray;
begin
foo(arr);
end;
答案 1 :(得分:1)
错误消息的确意味着它所说的内容,它与作为动态数组的参数无关。无论参数具有什么类型,编译器都会拒绝该代码,因为您不允许为通过引用传递的参数提供默认值。
要制作可选的参考参数,请使用重载来提供该函数的两个版本。更改当前函数以按值或const接收其参数,如编译器所建议的那样,然后声明另一个不带该参数的函数,如下所示:
procedure testp (str : string);
var
arr: StringArray;
begin
testp(str, arr);
end;
即,声明一个虚拟参数并将其传递给“真实”函数。然后简单地扔掉它返回的值。
如果参考值的计算成本很高,那么testp
的单参数版本的实现将从双参数版本中复制更多代码。