喫茶XRAYトップページ

[スレッド全体
]

[9927] 今更きけない 動的配列…(いや、まぁ聞くんだけどさ)返信 削除
2016/5/15 (日) 19:47:35 taki
マスター 教えてください。
動的配列を使う度に、以下の記事が気になって心配になります。

------------------------------------------
Delphi/動的配列の罠
http://tobysoft.net/wiki/index.php?Delphi%2F%C6%B0%C5%AA%C7%DB%CE%F3%A4%CE%E6%AB

動的配列を「string のようなものだ」と思っていると痛い目に合います。
動的配列は参照カウンタつきポインタ

「代入したときは参照カウンタをインクリメント」してくれ、
「スコープが外れたときは、参照カウンタをデクリメントし、
  0になったら自動的に開放」はしますが、
「書き換えた時にコピー(copy on write)」はしてくれないのです。
------------------------------------------

説明はヘルプの「動的配列」のところに書いてあるそうなのですが、
Delphi XP4 Starter のHELPでキーワードに動的配列を入力しても説明が
見つかりません。

記事の説明のコードを見ると、単純に := で代入をするとポインタが
コピーされるので、「代入元と代入先が同じメモリーを参照します」と
読めるのですが、他に何か罠があるのでしょうか?

言葉で分からないのは「参照カウンタつきXX」の部分です。


[9932] Re:今更きけない 動的配列…(いや、まぁ聞くんだけどさ)返信 削除
2016/5/16 (月) 12:07:50 Mr.XRAY
▼ takiさん

> マスター 教えてください。

分かりません !! (キッパリ)

> Delphi/動的配列の罠
> http://tobysoft.net/wiki/index.php?Delphi%2F%C6%B0%C5%AA%C7%DB%CE%F3%A4%CE%E6%AB


あっ,これ,面白い !

>だから、「動的配列はポインタだ」という事だけ気をつけておけば
>いいのでしょうか?


だからか,どうかは分かりませんが (^^;
私的な立場では... ホホホッ.


[9933] Re2:今更きけない 動的配列…(いや、まぁ聞くんだけどさ)返信 削除
2016/5/16 (月) 12:51:38 Mr.XRAY
> あっ,これ,面白い !

興味ある方用に,テスト用のプロジェクトを UP しました.
自分で実際に確認するのが一番です.ハイ.
Delphi は GUI のアプリ開発用ですので,コンソールじゃないです.

mrxray.on.coocan.jp/Delphi/zip/DynamicArrayTest_Integer.zip
(544 KB)


[9934] Re3:今更きけない 動的配列…(いや、まぁ聞くんだけどさ)返信 削除
2016/5/16 (月) 13:15:30 Mr.XRAY
> 興味ある方用に,テスト用のプロジェクトを UP しました.
> 自分で実際に確認するのが一番です.ハイ.
> Delphi は GUI のアプリ開発用ですので,コンソールじゃないです.
>
> mrxray.on.coocan.jp/Delphi/zip/DynamicArrayTest_Integer.zip
> (544 KB)


てなわけで,元の Integer の配列を独立させるためには,
動的な配列なので,領域を確保する必要があります.
添付のコードを以下のようにしてみてください.
元のコードは,コーディング通りの動作をしていることになります.

  Memo1.Lines.Clear;

  // array1の確保と変更
  SetLength(Array1, DefaultLength);
  SetLength(Array2, DefaultLength);
  for i := Low(Array1) to High(Array1) do
    Array1[i] := i;
  // array1 を array2 にコピーではなくて
  // (配列を示すアドレス-ポインタ - を同じにするのではなく)
  // arrayy1の値を array2に代入
  for i := Low(Array1) to High(Array1) do begin
    Array2[i] := Array1[i];
  end;

もっとも,

> Delphi/動的配列の罠
> http://tobysoft.net/wiki/index.php?Delphi%2F%C6%B0%C5%AA%C7%DB%CE%F3%A4%CE%E6%AB


が,何を狙ったのかは,よく分かりませんが (^^;
別に「罠」でも何でもないと思いますが...


[9936] Re4:今更きけない 動的配列…(いや、まぁ聞くんだけどさ)返信 削除
2016/5/16 (月) 13:28:08 Mr.XRAY
> 別に「罠」でも何でもないと思いますが...

これが「罠」だったら,コンポーネントやクラスのインスタンスの代入は
全て「罠」になっちゃいます.


[9937] Re5:今更きけない 動的配列…(いや、まぁ聞くんだけどさ)返信 削除
2016/5/16 (月) 13:41:57 Mr.XRAY
> 全て「罠」になっちゃいます.

この「罠」を利用すると,以下のようなことができます.
先のサンプルの Array2 := Array1 と同じです.

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
var
  LSG : TStringGrid;
begin
  // LSGのインスタンスは生成していないが
  // StringGrid1のインスタンスを代入している
  // LSGとStringGrid1は同じになる(同じメモリアドレスを示す)
  LSG := StringGrid1;

  if ACol = 2 then begin
    LSG.Canvas.Brush.Style := bsSolid;
    LSG.Canvas.Brush.Color := RGB(0, 150, 0);
    LSG.Canvas.FillRect(Rect);
  end;
end;


[▼次のスレッド]
INCM/CMT
Cyclamen v3.82