まず、不思議に思ったところから。
「タイトル.png」等というものは当然私の環境にはありませんので、せっかくコードを提示してもらっても動かすことができません。
(そりゃ、代わりの画像をこちらで作れば動きますけれども、わざわざ代わりの画像を作ってまで相手をしてくれるほど親切な人はそうそういません。皆忙しいのです...。
私もしばらく掲示板ご無沙汰で、春休みが近づき空きコマも増えてきたところで息抜きついでに久々にこうやって回答しています。)
どうしても画像が必要ならスクリプトと画像一式をtarかzipにでもまとめてどこかにアップロードして、回答してくれる人が直ぐに本質に取り掛かれるようにお膳立てしておくとよいです。
辛口なことを言いましたが、怒っているわけではありません。あなたの質問態度に悪意は感じません。今後気を付けてくだされば結構です。
次に、本題です。
>#defcfuncはC言語で言う戻り値のある関数、#deffuncはVoid型関数という風に考えてよいのですね?
とりあえずそのイメージでよいと思います。
>画像の読み込みをモジュールで行い、モジュールでの結果をグローバルに持ってきて画像を出すという感じなのですが…
発想は良いと思います。
>そもそもモジュール空間の数値などはグローバルに持ってこれないんですね。
惜しい。
こんとんさん、ここで歯痒い思いをしていますね...?
実は可能。2つの方法があります。一つは全うな方法で、もう一つは一般には邪道と言われそうな方法です(※私は高速化のために自作モジュールの中でこの方法をしばしば慎重に使いますが。むやみに使うとめちゃくちゃになります)。
① モジュール空間(V_m)に入っている関数(f1_V)(※命令でもよいが、終了コードが欲しいという前提でここでは関数を採用する。結局どちら使おうと工夫でなんとでもなるのでその辺はプログラマ次第。)
のパラメタとして変数(Var1)を渡し(※渡せる変数は1つとは限らず、いくつでも都合に応じて好きなだけ渡せばよい(Var2,Var3,...)。それらは配列でもよい。)、f1_V 側の処理の結果を Var1 に書き込む。
f1_V から復帰して処理がグローバルに戻ってきたら、 Var1 から所望の値を取り出す。
例えば画像を読み込んでそのx,yサイズを取得する一連の手続きをまとめてモジュール化して f1_V として実装することを考えると、
f1_V に定めるべきパラメタとして例えば次が考えられる。
param1 : fpath : 文字列型定数 : 読み込み対象のファイルのフルパス
param2 : picsize : int型1次元2要素配列 : 読み込んだ画像のx,yサイズの格納先。要素(0),(1)にそれぞれx,yサイズが格納されるものとする。 もちろん、この「格納する」処理は f1_V でやる。
② グローバル空間から、モジュール空間内の変数を覗き見する。
モジュールを作るとき、
#module mod1
#global
とすると、何が起こるか?
そのモジュール空間の変数/命令等の正式名称が、末尾に「@mod1」を伴ったものになります。
また、モジュール内の命令/関数内で新規に作成した変数は、その命令/関数が終了したあとも破棄されることなく残っています。(驚いたでしょうか?)
(C言語でもひたすら static すればそういうことができると思いますが。ただ、相変わらずスコープの外から覗けないと思います。(私はまだ C++ を始めて間もないのでこの辺に関して拙いところがあるかと思います。間違い等ありましたらご指摘ください。))
例えば、上述のモジュールの関数内で「a」と記述した変数をモジュールの外部から覗こうと思ったら、「a@mod1」と書けばいいのです。
(例)
#module mod1
#deffunc cmd1
x = rnd(10)-5
return
#global
randomize
cmd1
mes x@mod1 ;見えた!
この例では覗いているだけですが、書き換えることもできます。
また、「a@mod1」という名前は「正式な名前」なので、この空間内でもこの呼び名は通用します。つまりこの空間内では「a」と書こうが「a@mod1」と書こうが、実は同じなのです。
さらに突っ込んだ話をすると、モジュール内部からグローバル変数を覗き見したいなら、末尾に「@」を付けるだけでよいです。
(例)
#module mod1
#deffunc cmd1
mes buf@
buf@ = "誓って故郷を出たからは~..." ;このように、書き換えることもできる。
return
#global
buf = "勝ってくるぞと勇ましく~..."
cmd1
mes buf
もう気づいたかと思いますが、HSPの「モジュール化」とは、詰まる所この程度のものなのです。落胆したでしょうか...? 残念ですが特性だと思って受け入れるしかありません。
多種のデータが飛び交い、関数がタイミング的に複雑に絡むようなプログラムをHSPで作るのは骨の折れる仕事になります。
さて、2つの方法を述べましたが、私としては極力 ① を使うことおすすめします。
どうでしょうか。ヒントになりましか?
こんとんさんに考えてほしかったので、あえて画像読み込みのモジュール化のサンプルは作っていません。しかしヒントを参考にして簡単に作れると思います。
分かりやすく説明したつもりですが、何か不明な点,取り残した点,私の勘違い等見つけられたら復た聞いてください。時間があるときに答えます。では、頑張ってください。