加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-15 09:10:10 所属栏目:大数据 来源:网络整理
导读:使用D2010,我想做这样的事情: procedure SizeArray(var aArr: array of integer; aSize: integer);begin SetLength(aArr,aSize);end; 但这无法编译.因为我的“aArr”参数不是动态数组,所以它是一个开放数组参数.并且无法调用SetLength.我知道强制参数为动态
使用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;

…最终使用的匿名名称不等同于任何其他类型的名称.这就是你得到错误的原因.错误可能很有用;例如,考虑一个千米数组与千克数组 – 但通常情况下,为每个不同类型声明一个名称是不方便的.

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

在tarray< T>声明如下:

type
  TArray<T> = array of T;

…所以它可以为任意动态数组提供名称.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读