Delphi SetLength用于Integer数组

时间:2014-07-21 18:42:54

标签: delphi

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

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;

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

2 个答案:

答案 0 :(得分:5)

您正面临错误,因为SetLength对动态数组进行操作而且不是动态数组。那是open array parameter

您需要使用动态数组:

procedure appendToIntegerArray(var intArr: TArray<Integer>; valueToAppend: Integer);
....

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

type
  TIntegerArray = array of Integer;

procedure appendToIntegerArray(var intArr: TIntegerArray; valueToAppend: Integer);
....

或者您可以使用RTL中声明的类型TIntegerDynArray。此类型在Types单位中声明。

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


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

答案 1 :(得分:4)

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

这是泛型TArray<T>的设计目标。如果可以,请将参数设为TArray<integer>。如果没有,请考虑更新到更新版本的Delphi(如果你仍然使用旧版本,那么你会错过很多版本!)同时,声明一个类似的数组类型:

type
   TMyIntegerArray = array of integer;

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