HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2011
1029
木村モジュール変数は傘下状態の最新を追跡できるのか1未解決


木村

リンク

2011/10/29(Sat) 20:00:01|NO.42715


#module m_A 要素1, 要素2 #modinit 要素1 = 0 要素2 = "" return #modfunc add_elem1 要素1(100) = 100 return #modfunc dup_elem1 var clone dup clone, 要素1 return #global #module m_B 要素3, 要素4 #modinit var a 要素3 = a 要素4 = 0 return #modfunc add_elem3 add_elem1 要素3 return #modfunc dup_elem3 var clone dup_elem1 要素3, clone return #global //Step1:m_Aというクラス(=モジュール)の実体(=モジュール変数)aを作成 newmod a, m_A //Step2:前述のaを状態(=モジュール変数名)に持つm_Bクラスの実体bを作成 newmod b, m_B, a //Step3:bの状態のaの要素1を取得(現時点では『aの要素1』の配列長は1) dup_elem3 b, clone //Step4:bを介さずにaの要素1を変更(この操作で『aの要素1』の配列長が101に) add_elem1 a //Step5:bが保有するaの要素1を取得(取得した配列長は101) dup_elem3 b, clone2 stop
 dup命令の説明に書いてある通り、配列変数の拡張みたいなポインタの変動がクローン元の変数に起きると、dup命令で作ったクローン変数はクローン元の変数との同期を失います。
 しかし、拡張された変数を状態(=モジュール変数名=内部変数=パラメータ)に有するモジュール変数(=実体=インスタンス=オブジェクト)は、モジュール命令を介さずに変更されたポインタさえ、上手く追跡して最新の状態を参照しているように見えます。
 多分、モジュール変数は各状態のデータを持つ変数へのポインタのみを保持する仕組みなので傘下データのポインタの変動に強く、その結果としてこのような事になるのだと思います。

 で、本題なのですが、以上よりモジュール変数の傘下の状態のポインタが様々な要因から変動しても、モジュール変数からの参照であれば問題無く最新の状態を取得できる、といえるかどうか教えてください。

 言い方を変えると、格納域の増加、変数の型変更、変数の再初期化、しかポインタが変動する要因は無いのでしょうか。という事です。
 そして、もしあるのなら、モジュール変数が追跡できないようなポインタの変動は存在するのか。という事です。

 一文当たりの文字数が随分多くなってしまいましたが、回答してくださると幸いです。



この記事に返信する


レノス

リンク

2011/10/29(Sat) 23:59:13|NO.42724

> モジュール変数が追跡できないようなポインタの変動
追跡するもなにも、モジュール変数は変数そのものを経由して変数の状態を参照するので、
ポインタが変動しても関係はないです。

そもそも
> 上手く追跡して最新の状態を参照しているように見え
ることがわかっているのなら
> モジュール変数からの参照であれば問題無く最新の状態を取得できる
ことは自明だと思いますが。

----
> 格納域の増加、変数の型変更、変数の再初期化、しかポインタが変動する要因は無いのでしょうか
“ポインタ変動”の原因は、主に2つです。
「変数の再初期化」→格納域の増加, 変数の型変更もこれを含みます。
「可変長バッファの拡張」→(例) str 型に長い文字列を代入したり、memexpand を使うなど(内部的には同じ)。



ONION software Copyright 1997-2021(c) All rights reserved.