PB 電子会議室
カテゴリ:ユーザオブジェクト
日付:2001年02月13日 12:07 発信者:ryochan
題名:RE(20):PB6.5: PBの動的配列の扱い
Takaさん、こんにちは。
すみません。RE18、19のレスは
直接のレスではありませんでした^^;
>datastore ds_a, ds_b
>MessageBox( \"addr1\", lstrcatA(ds_a,\"\") )
>f_get_datastore(ds_a) //既に生成済の他のDSを ref引数で取得
>MessageBox( \"addr2\", lstrcatA(ds_a,\"\") )
>ds_a = ds_b
>MessageBox( \"addr3\", lstrcatA(ds_a,\"\") )
>上のMessageBoxは、3回とも同じアドレスを返します。
>long型やdate型などで試しても同じ結果になりました。
>ところが、同じことをstring型や 動的配列の変数で実験すると、
>毎回違う値を返してきます。
>ということは、サイズが変わる可能性のある変数の場合は、
>代入文やref引数で受け渡しする際、PBが内部的に(勝手に)
>新しい領域を確保し直していると思われます。
>これがPBのクセだと言ってしまえばそれまでですが、C/C++などで
>ポインタの扱いに慣れている方にとっては悩ましいところですね。
そうですね、PBでは動的配列についてはポインタではなく
longやdateと同じく実データ部を指してしるからだと思います。
オブジェクト→ポインタをさす(ポインタ自体のアドレスは変化しない)
longやdate→実データ部そのものを指す
動的配列→longやdate同様、実データ部を指す
longやdateは値を変えても、アドレスは変化しない。
動的配列は要素を増やしたりすると、実データ部の
アドレスが変化する。(RE18,19の私の説明から)
本当は動的配列も実体をオブジェクトのように
ポインタで扱うと、このようにアドレス値が
ころころ変化しない為、楽なのですけどね。
その代わり
PBでは
long a[],b[]
a = {1,2,3,4,5}
b = a
とすれば
a[3] = 100
としても
b[3] = 3
のままですが
PBの動的配列の実体をポインタにする
仕様にしてしまうと
b[3] も 100
となってしまいます。
その辺りをできるだけ隠そうとPBはしているの
かもしれません。
付加情報:
PowerBuilder Version (記載なし)
Client SoftWare
OS Windows98
DBMS Oracle SQL*Net 8
Browser (記載なし)
Server SoftWare
OS (記載なし)
DBMS Oracle 8.0
WebServer (記載なし)
Copyright © 2013 Power Future Co., Ltd.