如何将动态数组切片为多个子数组? 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.
答案 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时间更短。
我知道。这个帖子很老了,但我仍然认为我的答案在这里是可行的,特别是对于新读者而言。