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


HSPTV!掲示板


未解決 解決 停止 削除要請

2006
0802
くにモジュール変数について質問7解決


くに

リンク

2006/8/2(Wed) 07:41:57|NO.1723

hsp3/モジュール変数 - HSP開発wiki
http://hspwiki.nm.land.to/?cmd=read&page=hsp3%2F%A5%E2%A5%B8%A5%E5%A1%BC%A5%EB%CA%D1%BF%F4&word=%A5%E2%A5%B8%A5%E5%A1%BC%A5%EB%CA%D1%BF%F4

を参考にして、モジュール変数の動作について調べていたのですが、

#module testmod modno,modvalue,body
; コンストラクタ
#modinit
; インスタンスの数をインクリメント
mes "コンストラクタが呼び出されました。"
modcnt ++
return
; デストラクタ
#modterm
; インスタンスの数をデクリメント
mes "デストラクタが呼び出されました。"
modcnt--
return
; インスタンスの個数を得る
#modfunc tm_getcnt var v
v = modcnt
return
; モジュールのメンバ変数にモジュール番号と値をセット
#modfunc tm_setvalue int n
modno = modcnt-1
modvalue = n
return
; モジュールのメンバ変数を表示
#modfunc tm_dispvalue
mes "mod["+modno+"] = "+modvalue+"("+body.0+","+body.1+","+body.2+")"
return
; インスタンス毎のスリーサイズをセット(メンバ変数を配列にできた)
#modfunc tm_setbody int b, int w, int h
body = b, w, h
return

// ここから
#modfunc tm_get var b1, var w1, var h1
b1 = body.0
w1 = body.1
h1 = body.2
return
// ここまで

#global
repeat 3
newmod m, testmod
tm_setvalue m(cnt), rnd(10)
tm_setbody m.cnt, 80+rnd(3), 59+rnd(3), 82+rnd(3)
tm_dispvalue m.cnt
loop

mes "配列の確保済み領域:"+length.m
tm_getcnt m, i

mes "インスタンスの数:"+i

mes "<< 有効なインスタンスの列挙 >>"
foreach m
tm_dispvalue m.cnt
loop

// ここから
tm_get b0, w0, h0
mes b0 + " " + w0 + " " + h0
//ここまで

というコードにしてみたところ、エラーになります。
書いたのは、「ここから〜ここまで」の部分です。

なぜ、エラーになるのか、ご教授いただけないでしょうか。



この記事に返信する


kz3

リンク

2006/8/2(Wed) 09:10:07|NO.1724

バグトラックの普及に活動的だったくにさんに影響されてバグトラックの活用を始めたのに、そのくにさんがこのような投稿とは...。
私より上級なくにさんなだけにちょっと残念です。orz
# 人違いでしたらすみません。無視してください。
# 初心者には言って上級者には言わないというのもあれなので...。

マニュアル( hspprog.htm )の「3.拡張文法 」「モジュール 」「■モジュール変数の定義 」に書いてあります。
tm_get命令を定義したのなら、既に定義されているその他の命令の呼び出し部を参考にすると分かると思います。

そのwikiページは以前書いたまま放置状態なので、間違いがあるかも知れません。



くに

リンク

2006/8/3(Thu) 04:01:07|NO.1736

> 私より上級なくにさんなだけにちょっと残念です。orz

いえいえ、僕なんか、kz3さんの足元にも及ばないのと
思います。実際のところ、HSPでは、あまりプログラムを書いてないですし。
それに、まだ、ここにあげた事は、調べている途中なので、
バグトラックに出すには、早いと思いましたので、ここで質問させて
いただいてます。

あと、バグトラックは、バグを解決するよいシステムと思って、
HSPでもバグトラックが根付くよう、宣伝してきましたが、
その効果があったようで、そう言って頂けると、うれしいです。

それで、本題ですが、

モジュール変数のところは、マニュアルを読んでも、
よく分らないように思います。
特に、モジュール変数から、どうやって値を取り出すか、
が説明されてないと思います。

マニュアルのサンプルには、

#modfunc viewxyz mes "x="+x+"/y="+y+"/z="+z return
というコードがあり、モジュール変数を表示することは、
できます。けれど、モジュール変数の要素をほかの変数に
代入する方法は、載っていません。

直接、モジュール変数の要素を参照できれば、よいのですが
できないので、Wikiのサンプルをまねて、上のコードを書きました。
僕の考えどおりなら、モジュール変数の要素を引数に与えた変数に代入する
命令を定義できているはずなのですが、うまくいきませんでした。

やはり、引数の型は、var型では、駄目なのでしょうか。
var型は、C言語のポインターと同じと思っているのですが、
違うのでしょうか。

モジュール変数は、C言語でいう、構造体のようなものですから、
少なくとも、その要素を設定したり、取り出したりできないと、
あまり使いようがないように思います。
ですから、上のようなコードを書いて、調べているのですが、
モジュール変数を使いこなしている人は、どのくらいいて、
このことをどう思っているのでしょうか。
僕個人としては、今の状態のモジュール変数では、
少なくとも自分には、使えないように思います。

あと、表記についても、

newmod v,a
より、
v = newmod(a)

のほうがすっきりしていいように、思いますが、どう思いますか。



kz3

リンク

2006/8/3(Thu) 09:39:15|NO.1740

>>そのくにさんがこのような投稿とは...。
>バグトラックに出すには、早いと思いましたので、ここで質問させていただいてます。

『このような投稿』というのは特にスクリプトを小文字の<PRE>...</PRE>で囲うという点についてでした。
内容に関することではないので^^;

>1) 特に、モジュール変数から、どうやって値を取り出すか、が説明されてないと思います。
> モジュール変数の要素をほかの変数に代入する方法は、載っていません。

## #deffunc命令( モジュール定義命令 )と #modfunc命令( 名称不明 )を、
## どう区別して呼んだらいいでしょう?
## あとモジュール変数についても区別する必要あり...。

先のスクリプトでくにさんが新たに追加した部分のエラーは、
#modfunc命令の呼び出し時に、モジュール型変数が指定されていないのが原因です。
このモジュール型を指定するパラメータは#moddunc命令を定義するときの引数には現れないので間違いやすいところです。

>2) モジュール変数は、C言語でいう、構造体のようなものですから、少なくとも、その要素を設定したり、取り出したりできないと、あまり使いようがないように思います。

## HSPWiKi:モジュール変数について
## http://quasiquote.org/hspwiki/Note%3aHSP%cd%d1%b8%ec%bc%ad%c5%b5#H-10vudtg

私も使いやすいとは思いませんー^^;
今の設計だとモジュール型変数は#modfunc命令を呼び出さないと値の設定・取得が出来ません。

一応メンバ変数のクローン変数だけなら、呼び出し側で作れるには作れるんですが...
クローン変数は結局一時的なものなので、値を取得する度にクローン変数を作らなければならないのは
おっくうですよね。

例えばこんな妄想をしていました。

#module "MStruct" m_p, m_q #modinit m_p = $11223344, $aabbccdd m_q = "test", "TEST" return #global newmod m, MStruct ; ▼ここから妄想・提案 // モジュール型変数のモジュール変数( メンバ変数 )を // 使われていない[]を用いて指定できるようにしたら使いやすい? // USAGE: // モジュール型変数名[モジュール変数名|モジュール変数のインデックス].モジュール変数の要素 p = m[0] ; p = m.0[0].0 もしくは p = m.0[m_p].0 // []内は変数名で参照できてもいいけど、 // そうすると使う側はメンバ変数の名前を調べなければならない。 // ん?それは構造体でも同じだし、労力ではないか。 mes p ; 287454020( $11223344 )がpに入っている s = m[1].1 ; s = m.0[1].1 もしくは p = m.0[m_q].1 mes s ; "TEST"が入っている



Irisawa

リンク

2006/8/3(Thu) 11:46:15|NO.1746

> var型は、C言語のポインターと同じと思っているのですが、
> 違うのでしょうか。

#func/#cfunc/#comfuncのvarはほぼポインタと同じですね。
(正確には指定した変数のポインタを渡す)
#deffunc/#defcfunc/#modfuncなどのvarは「『変数』を引数で渡す」ということを指して
いて上記のvarとは異なると思います。

# 同じ名前なので混同・混乱しますが、まったく概念が異なると考えた方がいいかもしれ
# ません。

> ですから、上のようなコードを書いて、調べているのですが、
> モジュール変数を使いこなしている人は、どのくらいいて、
> このことをどう思っているのでしょうか。

そもそも、サンプルが少ないなどの理由とまだHSP3で実装されたばかりの新しい機能という
こともあって、知名度自体が低く、モジュール変数を知っている人自体どれくらいいるのか
さえ不明です。
モジュール変数はまだまだ洗練されておらず、非常に使いにくい状態ですよね。
ただし、既に3.0は正式版がでており今から仕様変更するのは(たとえ、利用している人が
少なくても)非常に憂慮される事だとも思います。

モジュール変数は構造体というよりはクラスのメンバ変数に相当するかもしれません。
直接、モジュール変数のメンバにアクセスできないなどの点はメリットにもデメリットにも
なると考えられます。

> あと、表記についても、

> newmod v,a
> より、
> v = newmod(a)

> のほうがすっきりしていいように、思いますが、どう思いますか。

これは確かに、関数の方がいいかもしれませんね。
ただ、HSPの方針としては「引数を受けて値を変更(変換)」するのが関数で、
「引数により状態を変更」するのが命令という考えがあるようなのでこれに従うと
モジュール名(p2)の変数型を初期化して変数名(p1)に割り当てるというでこれはgetstrなど
と同様に命令の方が合っていることになるんですよね。
あと、


if newmod(a) = xxx { ... }

のようなこともしないはずですので関数である意味がないのかもしれません。

HSPのオブジェクト指向対応はまだまだ試行錯誤の連続で、これから発展していくところなの
かもしれませんね。
(一度に a("obj")->b("obj")->c->"property" とできないなど面倒で不便すぎる?)

連想配列などもHSPシステム的には対応しているとはいっても実質的に標準ではcomobj型
だけですし...。



くに

リンク

2006/8/5(Sat) 06:40:59|NO.1796

kz3さん、Irisawaさん、教えていただき、ありがとうございます。

おかげで、モジュール変数が、使いづらいことがよく分りました。
使いやすかったら使ってみようと思っていたのですが、
今のままでは、僕としてはだめです。

また、そのうち、改良されたら使ってみようかなと思います。

あと、


newmod v,a

の配列は、


newmod v,a(10)

とかで書けたら、便利かなと思います。
ただ、初期化の問題があるので、微妙ですが。



kz3

リンク

2006/8/5(Sat) 11:28:29|NO.1798

>使いやすかったら使ってみようと思っていたのですが、今のままでは、僕としてはだめです。

任意のモジュール変数の値を取得するのにいちいち命令を使わないといけないのが、ちょっと面倒ですよね。
『命令( メソッド )を通してでしかオブジェクトの内部にアクセスできない』というののメリットは、オブジェクトの仕様変更に強いとか、というのを何かで読みました。
# 用意されたメソッドを呼んでさえいれば、オブジェクトが適切に結果を返すとか??( でしゃばり )
# この辺りはC++/java使いの人に...。

モジュール変数の値を取得するのに#modfuncのパラメータに変数を指定するかシステム変数に値を設定して次の行で値を利用する...
( マルチステートメントを用いない場合 )単純に値を取得・取得するのだけで2行、この値が複数必要で計算に用いる時には必要な数だけ行数が増えますね。

使いづらい...で、HSPWiKiやNO.1740で「モジュール外からでもモジュール変数にアクセスできる」というような事を書きましたが、
モジュール定義命令でクローン変数を作る方向から、モジュール定義関数で値を直接参照・取得する、という方向に切り替え、HSP開発wikiのModule/mod_modvalを書きました。
( くにさん多分読んでると思うけど... )

まぁ十分とは言えないと思いますが、そこは多分誰かがより使いやすくしてくれる事を願って...ここで提案した
>モジュール型変数名[モジュール変数名|モジュール変数のインデックス].モジュール変数の要素
をそのまま関数にしただけです。
# もうちょっと調べればモジュール変数のインデックスではなく名前( 文字列 )でもアクセスできるかも、と予想してます。



naznyark

リンク

2006/8/6(Sun) 02:24:51|NO.1811

Irisawa さんが言っているようにモジュール変数は構造体というよりは C++ のクラスですね。

独立して扱える『複数の値』の『記憶』に使うのではモジュール変数の真価は発揮できません。
不可分な関係を持つ『一群の値』の『管理』に使うことでその真価が発揮されます。
(複素数とかベクトルとか)

とはいえ現状では機能が不十分で使いにくいのは確かですが・・・。


> 任意のモジュール変数の値を取得するのにいちいち命令を使わないといけないのが、ちょっと面倒ですよね。

本質的には同じことを意識せずにやっている場合があります。
ウィンドウメッセージを使ったウィンドウやコントロールへのアクセスです。

ウィンドウやコントロールのような本体のプログラムとは直接の関係を持たずに動作する
プログラム部品を作るのがモジュールの使い方の一つです。
その場合に内部で動作用のパラメータ保持に使うのがモジュール変数内の個々の変数ということになります。



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