Delphi SetLength用于Integer数组

Vik*_*sov 2 delphi

我想编写一个附加到Integer数组的过程,但Delphi IDE给出了编译时错误'Incompatyble types'.这是我的代码:

procedure appendToIntegerArray(var intArr : array of Integer; valueToAppend : Integer);
var
  counter : Integer;
begin
  counter := Length(intArr);
  SetLength(intArr, counter + 1); // This is where it gives me the compile-time error
  intArr[counter] := valueToAppend;
end;
Run Code Online (Sandbox Code Playgroud)

任何人都可以帮我修复手术吗?

Dav*_*nan 5

您正面临错误,因为SetLength操作动态数组并且不是动态数组.这是一个开放的数组参数.

您需要使用动态数组:

procedure appendToIntegerArray(var intArr: TArray<Integer>; valueToAppend: Integer);
....
Run Code Online (Sandbox Code Playgroud)

如果使用不支持通用数组的旧Delphi,则需要声明数组的类型:

type
  TIntegerArray = array of Integer;

procedure appendToIntegerArray(var intArr: TIntegerArray; valueToAppend: Integer);
....
Run Code Online (Sandbox Code Playgroud)

或者你可以使用RTL中声明的类型TIntegerDynArray.此类型在Types单元中声明.

Delphi类型系统的一个不足之处在于,类似的类型与TIntegerArray赋值不兼容,比如TIntegerDynArray因为它们是不同的类型.这使得处理使用不同数组类型的代码变得更加困难.泛型数组的一大好处是泛型的类型兼容性规则更加宽容.因此,如果您可以使用TArray<T>,请执行此操作.


如果你逐项追加,那么我通常建议列表类会更好.在这种情况下,您将使用TList<Integer>并简单地调用其Add方法.


Mas*_*ler 5

这是 Delphi 语法的怪癖之一:将 an 声明array of whatever为函数参数并不像您想象的那样将其定义为数组,而是将其定义为开放数组,一种可以接受任何正确基类型的数组的“神奇”类型。如果要使用特定类型的数组,则需要命名类型。

TArray<T>这就是泛型的设计目的。TArray<integer>如果可以的话,将参数设置为 a 。如果没有,请考虑更新到较新版本的 Delphi(如果您仍然使用旧版本,您会错过很多东西!),同时声明一个数组类型,如下所示:

type
   TMyIntegerArray = array of integer;
Run Code Online (Sandbox Code Playgroud)

并使用该类型作为参数类型,而不是array of integer在那里声明。

  • @FreeConsulting:给出一个特定的、明确的类型,该类型在整个程序中始终等于其自身。数组类型不等于(或赋值兼容)完全相同的数组类型是 Pascal 语言的“陷阱”之一,从一开始就存在,并且必须声明具体类型往往会导致每个人都声明自己的类型自己的,当两个不同的库这样做时,这会导致其自身的兼容性问题。`TArray&lt;T&gt;` 是解决这个问题的一种方法,通过在 `System` 单元中声明它*一次*,然后这就是您所需要的。 (2认同)