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 に答える