如何切片动态数组?

时间:2014-06-25 08:43:04

标签: delphi delphi-xe6

如何将动态数组切片为多个子数组? Delphi中的Slice()函数不支持动态数组。那怎么办呢?欢迎使用通用解决方案。

program Project10;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils;

var
  A: Array of Integer;
begin
  SetLength(A, 4);
  Slice(A, 2); // [dcc32 Error] Project10.dpr(15): E2193 Slice standard function only allowed as open array argument
end.

2 个答案:

答案 0 :(得分:6)

使用Copy(A, 0, 2)代替Slice(A, 2)

关键是你需要一个“开放数组参数”(在这种情况下你需要Slice)或者你需要一个常规数组,在这种情况下Copy将提供一个很好的解决方案。 / p>

答案 1 :(得分:1)

可以使用指针从不同的“起点”

访问动态数组

考虑代码:

TYPE
  tListArray = ARRAY[0..0] OF CARDINAL; {Or any other type you need}
  tDynamicCardinalArray = ARRAY OF CARDINAL;
VAR
  MyList : tDynamicCardinalArray;
  pArrPos1, pArrPos2 : ^tListArray;
BEGIN
  SetLength(MyList,100);
  pArrPos1 := @MyList[0];
  pArrPos2 := @MyList[50];
  ...
  ...
END;

好处是您可以直接访问,不会复制或移动涉及的数据。 缺点是不能在这些阵列指针上使用诸如“高”,“低”和“长度”的功能。或者至少不是你想要使用的结果。 在处理数组指针时,您必须确保永远不会超出SourceArray MyList的范围。 好处是它为动态阵列带来了多功能性。 众所周知,动态数组只能从0 ..创建,最大可达。 另一方面,pArrPos2有效地将动态数组渲染为一个也接受负寻址的数组指针:

pArrPos2^[-50] :=  0; // Equals: MyList[ 0] :=  0
pArrPos2^[  0] := 50; // Equals: MyList[50] := 50
pArrPos2^[ 49] := 99; // Equals: MyList[99] := 99

使用指针,您可以将动态数组“切片”成几个部分,但是您必须分别跟踪“高”,“低”和“长度”,至少如果您需要一个完全动态的解决方案,可以在软件中随时更改。 所需的额外信息可以作为额外参数传递给过程或函数,并且比实际复制或将数据集移动到新数组中所花费的CPU时间更短。

我知道。这个帖子很老了,但我仍然认为我的答案在这里是可行的,特别是对于新读者而言。