【发布时间】:2009-10-30 21:19:08
【问题描述】:
使用 D2010,我想做这样的事情:
procedure SizeArray(var aArr: array of integer; aSize: integer);
begin
SetLength(aArr,aSize);
end;
但这无法编译。因为我的“aArr”参数不是动态数组,它是一个开放数组参数。并且不能在其上调用 SetLength。我知道强制参数为动态数组的唯一方法是给它一个类型名称,如下所示:
type
TIntArray = array of integer;
procedure SizeArray(var aArr: TIntArray; aSize: integer);
begin
SetLength(aArr,aSize);
end;
现在代码编译了。在大多数情况下它工作正常,但这失败了:
procedure Test;
var
a : array of integer;
begin
SizeArray(a,5);
end;
因为实际和形式 var 参数的类型必须相同,并且编译器不会将“整数数组”和“TIntArray”识别为相同类型。
所以,这是我的问题:有什么方法可以让编译器将我的 var 参数识别为动态数组而不是开放数组,以便调用者可以声明一个简单的“整数数组”而不是一些命名的输入?
提前致谢。
【问题讨论】:
-
你为什么想要/需要?这是标准的 Pascal 用法。您需要做的就是将“a”声明为:TIntArray。如果您正在处理遗留代码,则无论如何都需要对其进行更改(以添加对 SizeArray 的调用)我假设 SizeArray 只是一个示例 - 否则为什么不直接调用 SetLength>
-
强制调用者使用命名类型有效,但这不是我的偏好。我想要一些不需要它并且可以接受简单的“X 数组”类型的东西。所以我想我会问一下,看看是否可以做到。
-
调用者使用正确的类型真的没什么大不了的。你一直都在使用记录和类类型,那么为什么不使用其他结构化类型呢?而且这是程序员很快就会发现的要求,因为否则代码将无法编译,所以这不像您要放入一些定时炸弹,直到产品即将交付使用时才会爆炸。只要确保使用 RTL 提供的类型(如果有的话),而不是自己编写声明。
标签: delphi delphi-2010