使用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参数识别为动态数组而不是开放数组,以便调用者可以声明一个简单的“整数数组”而不是一些命名类型?
提前致谢。
答案 0 :(得分:10)
Pascal,以及Delphi,对数组类型(包括动态数组)使用名称等价而不是结构等价。使用没有名称的类型声明的变量,如下所示:
var
x: array of Integer;
...最终使用的匿名名称与其他任何类型的名称都不相同。这就是你得到错误的原因。错误可能很有用;例如,考虑一个Kilometers
数组与一个Kilograms
数组的数组 - 但通常情况下,为每个不同类型声明一个名称是不方便的。
为了解决这个问题,并保持安全类型系统(因此避免使用无类型参数,如skamradt建议的那样),我建议对每个特定的数组形状使用相同的名称。您可以使用系统单元中声明的TArray<T>
类型在相当大的程度上执行此操作。因此,请使用array of Integer
。
TArray<Integer>
TArray<T>
声明如下:
type
TArray<T> = array of T;
...因此它可以为任意动态数组提供名称。
答案 1 :(得分:9)
这确实是可能的......只需使用absolute关键字和无类型的var。
procedure SizeArray(var aArr; aSize: integer);
var
ActArr : Array of Integer absolute aArr;
begin
SetLength(ActArr,aSize);
end;
var
Test : Array of Integer;
begin
SizeArray(Test,5);
showMessage(IntTostr(High(Test))); // -- returns 4
end;
答案 2 :(得分:0)
不,没有办法做到这一点。它是Pascal语言规范的一部分,不太可能改变。
编辑:Skamradt找到了办法。让我重申一下。没有办法安全地