是否可以从引用中获取(静态/动态)数组的长度?

时间:2017-10-15 20:29:16

标签: arrays delphi pointers

我想将数组的引用传递给需要数组长度的函数。我想知道我是否必须传递它的长度,或者我可以从数组引用中检索它。

uses
  Vcl.Dialogs, System.SysUtils, System.Types;

type
  IntegerArray  = array[0..$effffff] of Integer; // defined in System
  PIntegerArray = ^IntegerArray; // defined in System

procedure Foo(const P: PIntegerArray);
begin
  ShowMessage(IntToStr(Length(P^)));
end;

const
  A: array[0..2] of Integer = (1, 2, 3);
var
  B: TIntegerDynArray;

initialization
  Foo(@A);
  B := [4, 5, 6];
  Foo(@B[0]);
end.

2 个答案:

答案 0 :(得分:8)

要完成此操作,您需要声明open array参数:

procedure Foo(const A: array of integer);
begin
  ShowMessage('Length of array:'+IntToStr(High(A)+1));
end;

将动态和静态数组传递给过程,数组长度由System.High给出。

  

Open数组:Integer类型的值,给出实际参数中的元素数减去一。

答案 1 :(得分:5)

您的问题等于以下内容:

  

给定数组的第一个元素的地址(可以是静态的还是动态的),我可以找到该数组的长度吗?

答案是否定的。你的方式有两个因素。

  1. 您无法判断数组是动态的还是静态的。
  2. 即使你知道数组是静态的,如果没有编译时知道它的类型,你将无法找到它的长度。