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


HSPTV!掲示板


未解決 解決 停止 削除要請

2010
0511
sakモジュール変数の確保について5解決


sak

リンク

2010/5/11(Tue) 07:57:37|NO.32597


;モジュール Test #module Test A, B, C, D, E, F, G ;値Aを設定 #modfunc SetA int In_A A = In_A * 10 return ;値Aを取得 #modcfunc GetA return A #global ;モジュールを生成 repeat 10 newMod Mod, Test loop ;モジュールに値を設定 repeat 10 SetA Mod.cnt, cnt loop ;モジュールから値を取得 repeat 10 mes GetA ( Mod.cnt ) loop

上記のスクリプトでは、
モジュール「Test」に、
モジュール変数「A, B, C, D, E, F, G」を登録していますが、
実際に使用されているのは「A」だけです。

この場合、残りの「B, C, D, E, F, G」について、
メモリ領域は確保されているのでしょうか?

この質問の理由は、newmodでモジュール型変数を大量に作った場合、
使われていないモジュール変数の分も、
メモリが確保されているのではないかという危惧からです。

簡潔に言うと、

repeat 10 newMod Mod, Test loop
と、

dim A, 10 dim B, 10 dim C, 10 dim D, 10 dim E, 10 dim F, 10 dim G, 10
では、メモリ確保領域に違いはあるのか。
という事になります。



この記事に返信する


deque

リンク

2010/5/11(Tue) 09:41:24|NO.32598

ある。



sak

リンク

2010/5/11(Tue) 10:31:36|NO.32600

「ある」ということは、

#module モジュール名 モジュール変数名
で定義したモジュール変数名は、マクロ定義のようになっていて、
内部で
モジュール変数名
が使われたときや、宣言されたときに初めて、
他の同名モジュール変数と混合しないように領域が確保されるということでしょうか。



テック

リンク

2010/5/11(Tue) 11:52:18|NO.32604

>この質問の理由は、newmodでモジュール型変数を大量に作った場合、
>使われていないモジュール変数の分も、
>メモリが確保されているのではないかという危惧からです。
>では、メモリ確保領域に違いはあるのか。

結論から言うとnewmod命令とdim宣言で確保される
メモリ確保領域のサイズは、同じです。
モジュール変数A, B, C, D, E, F, Gが定義してあり、
Aを扱う命令しか実装していなくても
モジュール変数A, B, C, D, E, F, G分、メモリ領域を確保します。
これは、C言語やJavaでも同じことです。
なので、使用しない変数は定義しないようにしましょう。

では、newmod命令とdim宣言では、なにが違うのかというと
確保するタイミングと確保したメモリ領域がプロセス終了まで確保され続けるのか
任意のタイミングで解放されるかがあります。

dim宣言の場合は、プロセス実行開始時にメモリ領域が確保され
プロセス終了まで確保され続けます。
newmod命令の場合は、プロセスを実行し、newmod命令の箇所にきたときに
メモリ領域が確保されます。
また確保したメモリ領域の解放は、delmod命令で任意のタイミングでできます。

モジュール変数というのは、C++やJAVAでいうclass(クラス)の機能を
実装したものだと思います。
(完全に同じものではありませんが類似しているので・・・)

一応C++との対応表を記載しておきます。
間違いがあればご指摘下さいm(_ _)m

HSP
#module Test A, B, C, D, E, F, G

C++
class Test {
 int A, B, C, D, E, F, G;

HSP:C++
newmod:new
delmod:delete

参考文献:HSP3リファレンスブック
 (著:おにたま氏、悠黒喧史、うずあじ氏 出版社:I/O BOOKS)

↓確認スクリプト

;モジュール Test #module Test A, B, C, D, E, F, G ;コンストラクタ(初期化ルーチン) ;※newmod命令が実行されたときに、呼び出される ;引数 ; なし ;戻り値 ; なし #modinit mes "生成された" return ;デストラクタ(終了化ルーチン) ;※delmod命令が実行されたときに、呼び出される ;引数 ; なし ;戻り値 ; なし #modterm mes "解放された" return ;値Aを設定する ;引数 ; In_A ;戻り値 ; なし #modfunc SetA int In_A A = In_A * 10 return ;値Aを取得する ;引数 ; なし ;戻り値 ; 値A #modcfunc GetA return A ;module Test A, B, C, D, E, F, G #global ;モジュールを生成する repeat 10 newmod Mod, Test loop ;モジュールに値を設定する repeat 10 SetA Mod.cnt, cnt loop ;モジュールから値を取得する repeat 10 mes GetA (Mod.cnt ) loop ;モジュールを解放する repeat 10 delmod Mod.cnt loop stop



ぺnう

リンク

2010/5/11(Tue) 16:31:19|NO.32608

ありがとうございます。

モジュールが生成されたときに、
全てのモジュール変数領域が確保される仕様のようですね。



ぺnう

リンク

2010/5/11(Tue) 18:00:09|NO.32611

 



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