gpt4 book ai didi

delphi - 我可以将未命名的动态数组类型作为 Var 参数吗

转载 作者:行者123 更新时间:2023-12-03 15:37:35 25 4
gpt4 key购买 nike

使用 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 以及扩展的 Delphi 对数组类型(包括动态数组)使用名称等效而不是结构等效。使用没有名称的类型声明的变量,如下所示:

var
x: array of Integer;

...最终使用了一个不等同于任何其他类型名称的匿名名称。这就是您收到错误的原因。该错误可能是有用的;例如,考虑 Kilometers 的数组与 Kilograms 的数组对比- 但通常情况下,为每个不同的类型声明一个名称是不方便的。

为了解决这个问题,并保持在安全类型系统内(因此避免使用非类型化参数,如 skamradt 所建议的那样),我建议对每个特定的数组形状使用相同的名称。您可以使用 TArray<T> 在相当大的程度上做到这一点在系统单元中声明的类型。因此,不要使用 array of Integer ,使用TArray<Integer> .

TArray<T>声明如下:

type
TArray<T> = array of T;

...因此它可以为任意动态数组提供名称。

关于delphi - 我可以将未命名的动态数组类型作为 Var 参数吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1652378/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com