4

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

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.
4

2 回答 2

6

使用Copy(A, 0, 2)而不是Slice(A, 2).

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

于 2014-06-25T08:51:10.673 回答
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;

好处是您可以直接访问,无需复制或移动数据。缺点是不能在这些数组指针上使用诸如“high”、“low”和“length”之类的函数。或者,如果您想要使用结果,至少不会。在寻址数组指针时,您必须确保永远不会超出 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 时间更少。

我知道。这篇文章很旧,但我仍然认为我的回答在这里/可能是相关的,特别是对于新读者。

于 2017-01-18T05:18:13.470 回答