喫茶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」の部分です。


[9956] 型宣言された整数型の配列の操作返信 削除
2016/5/17 (火) 23:57:22 Mr.XRAY
> ------------------------------------------
> Delphi/動的配列の罠
> http://tobysoft.net/wiki/index.php?Delphi%2F%C6%B0%C5%AA%C7%DB%CE%F3%A4%CE%E6%AB
>
> 動的配列を「string のようなものだ」と思っていると痛い目に合います。
> 動的配列は参照カウンタつきポインタ


これ読み直してみたら,TOBY さんのブログ ? まずい !!
かなりキツイこと書いてしまったかな ?

下の方に「対策」として

>SetLengthして for ループで1つ1つコピーしてもいいのですが、面倒ですので、
>copyを使います。


つまり,Array2 := Array1; のようにして配列の要素のコピーができない.
ということなんですね.
上の文章を,型定義に適用したら

『クラス,コンポーネントを「String のようなものだ」と思っていると痛い目に
合います』
ということになってしまいます.そう思っている人って,多分あまりいないと思います.
だから,TIntegerDynArray も同じなんです.

記事書きました.

[型宣言と型宣言なしの配列 - 整数型配列の場合]
http://mrxray.on.coocan.jp/Delphi/Others/TypeArray.htm


[9957] Re:型宣言された整数型の配列の操作返信 削除
2016/5/18 (水) 12:20:28 Mr.XRAY
> 『クラス,コンポーネントを「String のようなものだ」と思っていると痛い目に
> 合います』
> ということになってしまいます.そう思っている人って,多分あまりいないと思います.
> だから,TIntegerDynArray も同じなんです.


これ間違っていますね.変です.う〜ん.
 
> [型宣言と型宣言なしの配列 - 整数型配列の場合]
> http://mrxray.on.coocan.jp/Delphi/Others/TypeArray.htm


この記事も読み返したら,ちょっと変です...
こういう記事は苦手です.
まっ,いいか... (^^;

代議士ではありませんが,
「誤解を招いたら,ゴメンナさい」


[9959] Re2:型宣言された整数型の配列の操作返信 削除
2016/5/18 (水) 14:52:28 taki
▼ Mr.XRAYさん
 
> この記事も読み返したら,ちょっと変です...
> こういう記事は苦手です.
> まっ,いいか... (^^;
>
> 代議士ではありませんが,
> 「誤解を招いたら,ゴメンナさい」


マスター 悩ませてしまいごめんなさい。

TOBY氏のこの記事の意図は
『「書き換えた時にコピー(copy on write)」はしてくれないのです。』の
部分にあるように思えます。

Delphiのコーディングではintegerやstringなどで定義した変数は、:= による
代入やvar指定していない関数の引数は元の変数の値が先の変数へコピーされます。
コピーされることで、元の変数の値は先の変数の値と分離されます。
しかし動的配列は代入してもコピーされませんから注意してください。

という事でしょう。

マスターにとっては、ポインタなんだから「当たり前」と感じられるかもしれま
せんが、私のレベルではポインタという事が頭にありませんからintegerやstringと
同じように扱って、動的配列のデータが意味不明な値になって壺にハマって
しまいかねません。

また、このページのおかげで copy できる事も知りましたし…。


[9960] Re3:型宣言された整数型の配列の操作返信 削除
2016/5/18 (水) 15:21:54 Mr.XRAY
▼ takiさん

> マスター 悩ませてしまいごめんなさい。

とんでもないですよ.
こういうやりとりがあるから,いろいろ自分の知識の確認や,知識を得ることが
できるのだと思います.
某掲示板のように,
『できました.うまくいきました』
だけで終わったら,進歩がないと思うんですが...

逆にしつこく私が書くので,そっちの方が迷惑かも.
でも,質問等をした方だけでなく,この喫茶XRAY を観ている方向けに
書いているつもりです.
そして,自分自身の確認のためにも (^^;

> しかし動的配列は代入してもコピーされませんから注意してください。

多分そういうことです.
「整数,文字列」というのは,クラスと違い,単純な型のイメージがありますから.
TOBY さん,いろいろ書いてスミマせん.ゴメンなさい m(_ _)m
 
> また、このページのおかげで copy できる事も知りましたし…。

そう思っていただけると嬉しいです.
あっ ! TOBY さんとこには書いてありますね.
掲載した記事は,整数型配列の使い方のように思っていただけると,
と思っています.
ポインタやら,参照カウント等を持ち出すとややっこしくなりますので.


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