Delphi SetLength用于整数数组

Delphi SetLength用于整数数组,delphi,Delphi,我想写一个附加到整数数组的过程,但DelphiIDE给了我编译时错误“不兼容类型”。这是我的代码: procedure appendToIntegerArray(var intArr : array of Integer; valueToAppend : Integer); var counter : Integer; begin counter := Length(intArr); SetLength(intArr, counter + 1); // This is where i

我想写一个附加到整数数组的过程,但DelphiIDE给了我编译时错误“不兼容类型”。这是我的代码:

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;

有人能帮我修复我的过程吗?

您面临错误,因为
SetLength
在动态数组上运行,而这不是动态数组。这是一个错误

您需要改用动态数组:

procedure appendToIntegerArray(var intArr: TArray<Integer>; valueToAppend: Integer);
....
或者可以使用RTL中声明的类型。此类型在
Types
单元中声明

Delphi的类型系统的一个恼人之处是,像
TIntegerArray
这样的类型与赋值不兼容,比如说,
TIntegerDynArray
,因为它们是不同的类型。这使得处理使用不同数组类型的代码变得更加困难。泛型数组的一个巨大好处是泛型的类型兼容性规则更加宽容。因此,如果您可以使用
TArray
,请这样做



如果您是逐项追加,那么我通常建议使用list类会更好。在本例中,您将使用
TList
并简单地调用其
Add
方法

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

这就是通用的
TArray
设计的目的。如果可以的话,将您的参数设置为a
TArray
。如果没有,考虑更新到一个更新版本的Delphi(如果你仍然在一个旧版本上,你就错过了很多),同时,声明一个数组类型,比如::/P>
type
   TMyIntegerArray = array of integer;

并将该类型用作参数类型,而不是在此处声明整型数组。

FWIW,以前开放数组不是类型。这是一个语法结构。我想知道,参数化类型使用在这里有什么好处?只是为了避免声明?@FreeConsulting:给出一个在整个程序中始终等于自身的特定、明确的类型。数组类型不等于(或赋值不兼容)完全等效的数组类型是Pascal语言从一开始就存在的“陷阱”之一,必须声明具体类型往往会导致每个人声明自己的类型,当两个不同的库执行此操作时,会导致其自身的兼容性问题
TArray
是一种解决此问题的方法,它在
系统
单元中声明一次,然后这就是您所需要的。再次,我想推荐这篇文章(我的):。请看一看名为“混淆”的部分。可能与
type
   TMyIntegerArray = array of integer;