动态数组作为Delphi 7中的可选参数

时间:2013-10-10 14:00:35

标签: arrays delphi delphi-7 dynamic-arrays

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

我试过这样的方式:

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?

2 个答案:

答案 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的单参数版本的实现将从双参数版本中复制更多代码。