2

私は多次元配列を持っています:
TBMArray = TArray<array of byte>;
そして再帰関数
function goForSolve(bData: TBMArray; const iSize: integer): TBMArray;

この関数
tempData: TBMArray;
では、bData の値を変更せずに tempData を変更する必要があります。しかし、tempData を変更すると、bData も変更されます。関数で bData を tempData にコピーしてみた

procedure copyData(Source: TBMArray; var Dest: TBMArray);  
var  
  iCurEl, iLen: integer;  
begin  
  iLen := length(Source);  
  setLength(Dest, iLen);  
  setLength(Dest[0], 1);  
  for iCurEl := 1 to iLen - 1 do  
    setLength(Dest[iCurEl], iCurEl + 1);  
  for iCurEl := Low(Source) to High(Source) do  
    Dest[iCurEl] := Source[iCurEl];  
end;  

しかし、結果は同じです

tempData := bData;

値ではなく関数コピー ポインターのようです。

4

1 に答える 1

6

動的配列は参照型です。舞台裏では、データ構造へのポインタとして実装されています。動的配列変数を割り当てると、既存の動的配列オブジェクトへの別の参照を取得するだけです。したがって、それはあなたが観察する行動を説明しています。

動的配列のコピーを作成するために使用できる、適切な名前の関数がありますCopy。したがって、次のように書くことができます。

Dest := Copy(Source);

これにより、外側の配列のコピーが作成されますが、内側の配列は作成されません。代わりに、外側の配列を自分で反復処理し、呼び出しCopyて内側の配列の新しいコピーを作成する必要があります。おそらく次のようになります。

type
  TBMArray = TArray<TArray<Byte>>;

function CopyBMArray(const src: TBMArray): TBMArray;
var
  i: Integer;
begin
  SetLength(Result, Length(src));
  for i := 0 to high(Result) do begin
    Result[i] := Copy(src[i]);
  end;
end;

の定義を微調整したことに注意してくださいTBMArray。開発が大幅に容易になるため、同じことを行うことをお勧めします。ジェネリック型の型の互換性規則ははるかに緩和TArray<T>されており、可能な限り使用すると、より構成可能なコードが得られます。

于 2013-09-21T18:34:58.417 に答える