Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 是否可以从引用中获取(静态/动态)数组的长度?_Arrays_Delphi_Pointers - Fatal编程技术网

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

Arrays 是否可以从引用中获取(静态/动态)数组的长度?,arrays,delphi,pointers,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(c

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

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.

要完成此操作,您需要声明一个参数:

procedure Foo(const A: array of integer);
begin
  ShowMessage('Length of array:'+IntToStr(High(A)+1));
end;
将动态数组和静态数组传递给过程,数组长度由给出

开放数组:Integer类型的值,给出实际参数中的元素数减去1


你的问题如下:

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

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

  • 您无法判断数组是动态的还是静态的
  • 即使知道数组是静态的,如果不知道其类型的编译时知识,也无法找到其长度
    这段代码无法编译。我们不知道Pintegerray是什么。您应该使用开放数组。@DavidHeffernan您是说我应该将参数定义为开放数组,并传递数组本身而不是它的指针吗?如果我做对了,我必须说我的问题不是定义一个同时接受静态和动态数组的参数。我真的需要传递指针。你写“(打开/静态/动态)”。没有“开放”数组。有一个开放数组参数的概念,如下面的LU RD或中所述。是的,您应该将该参数声明为开放数组参数并传递数组本身(可能为const)。实际上,这将传递两个值:指向第一个元素的指针和长度减1,即HIgh()值。如果只传递一个指针,则长度未知。Tkank you@LURD,但情况并非如此。我刚刚回答了大卫的评论。我真的需要参数是指针。我可以编辑我的问题来描述为什么,如果你认为这会有所不同的话。不幸的是,编译器没有洞察力。正如David所说,向静态数组传递指针不会传递任何长度信息。