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


HSPTV!掲示板


未解決 解決 停止 削除要請

2014
0609
掘木モジュール名と変数名被りや命名規則10解決


掘木

リンク

2014/6/9(Mon) 00:29:40|NO.62371

ある程度機能を固めてモジュール化していく作業中に引っかかって、
今まで解決不能で泣き寝入りしてた問題がやっと解決したので。

こちらは命令内(#deffunc)でのみ使う一時変数にはlocalを付けるようにしていて、
その中でも小さい命令の場合、一時変数の用途(型)ごとに、
p(int,パラメータ),s(str),l(label),d(double),m(メモリ)
といった接頭辞に数値をつけてる。

#deffunc WriteText_SetPosition int posx,int posy,local p1,local p2,local m1
といった感じの宣言になるけど、この際の接頭辞mが曲者で、
デフォルトのモジュール名と被ってしまいます。(回避してくれないのよね…)
(#deffuncのヘルプ曰く、モジュールの自動割り当て名って"_m数値"じゃないの?)

そのため・・・

#module #global #module #deffunc Test01 var mem,local m1 mes mem sdim m1 mes mem return #deffunc Test02 str text,local m1 m1 = text Test01 m1 return #global s1 = "Test" Test02 s1
こんなソースを書くと、"Test"と2回描画できそうに見えて1度だけです。エラー表示無し。
数千行以上の規模のソースでこんなバグにブチ当たると再起不能になりかねません。
みんなも気をつけよう(泣
(モジュール単体でやってると何事もなく動くのに、
上に#moduleが増えると突然ばぐるんですよー…この絶望感は半端ない。)
過去の掲示板でもlocal変数にm1と付けてた方がおられましたが無事だろうか。

いままでm1、m2、…って付けてたやつどうしよう…。allocから取ってa1,a2?何かやだなあ。



この記事に返信する


check

リンク

2014/6/9(Mon) 14:00:30|NO.62375

正しい挙動じゃないか?
上記のサンプルなら、以下のように動いていると思うのだが。

14行目:s1に"Test"を代入。
15行目:Test02命令を実行。
10行目:ローカル変数m1に"Test"を代入。
11行目:Test01命令を実行。
5行目:mes命令で"Test"と描画。
6行目:sdim命令でローカル変数m1の中身=Test01命令で受け取っているmemをクリア。
7行目:mes命令で、クリアされ何も代入されていないmemを描画。
8行目:returnする。
12行目:returnする。

ローカル変数は関数内だけでなく、モジュール内で共通したメモリが使われているようだな。
安易にm1やm2といった名前を使うのではなく、もっと長い名前にするか、
もしくはローカル変数を使用しないかの二択か。

それにしてもちょっと誤解を招くような仕様だな。
C/C++をやっている人間にとっては尚更だ。



掘木

リンク

2014/6/9(Mon) 14:38:47|NO.62377

>checkさん

本来ローカル変数は"関数の呼び出しの度"メモリ空間を割り当ててるはずですよ?
そうでなければ再帰関数内での一時変数としてローカル変数が使えません。
実際、こちらが提示したサンプルの変数名をm1からmm1等の"m数字"以外の名前に変形すれば
出力結果が変わります。

原因自体はhsptmp.iを見るとわかります。
m1がローカル変数と指定されているが、このtrue-nameが"m1@m1"であり、
関数内で操作している変数のtrue-nameが"m1@"というグローバル変数であるためです。

そのためグローバルスコープにm1という変数がデバッグウィンドウに居てるかと思います。



y.tack

リンク

2014/6/9(Mon) 16:46:53|NO.62378

堀木さんの書き込みを読んで
自分もBBSとかでHSPの仕様のバグとか聞いたりするので
そういうのと ここのバグをまとめてみました

他にもそういうのある人がいたら書き加えるのもいいかも
http://quasiquote.org/hspwiki/HSPの仕様



GENKI

リンク

2014/6/9(Mon) 20:24:37|NO.62379

マニュアルや 仕様に不備があるなら、とりあえずバグトラックに報告。(…まだ機能してるのかな?)
今回のように判断難しければ、wikiよりBBSがいいかと。見る人も書き込む人も多いですし、過程は不要、最後の纏めをバグトラックやメールで報告すればいいので。

で、今回のは話を聞く限り意図した動作や、何か意図が隠れてるとも思えません。なのでバグとして報告をあげておいたほうがいいと思います。

> いままでm1、m2、…って付けてたやつどうしよう…。allocから取ってa1,a2?何かやだなあ。

小さい命令でもちゃんとその変数の意味で名前つけるようにした方がいいかと。
この際なので過去のもの全部見直してみては?短くても命令や変数の意味を理解するのに意外と時間かかるかもしれませんよ?


> http://quasiquote.org/hspwiki/HSPの仕様
「の仕様」が切れてる。これですね。
http://quasiquote.org/hspwiki/HSP%E3%81%AE%E4%BB%95%E6%A7%98

しかしこれ、ほとんどが実装時のバグでも仕様のバグでもないですよ。
ユーザに、難読ソースを書かせないための仕様だと思います。



y.tack

リンク

2014/6/9(Mon) 20:37:11|NO.62380

>しかしこれ、ほとんどが実装時のバグでも仕様のバグでもないですよ。
>ユーザに、難読ソースを書かせないための仕様だと思います。
確かにバグと言えば語弊があるかもしれません
僕も修正されることはないと思っています

しかし、他人の手を借りて 身に付けた知識ですし
どこかへ纏めておきたいとは なんとなく思っていたので

>今回のように判断難しければ、wikiよりBBSがいいかと。見る人も書き込む人も多いですし
僕に対してですか?wikiって書いているので僕に対してですよね
僕のサイトよりは 見る人多そうですし
BBSは修正辛そうなんで
なんか加えたいのがあれば書き加えたいので



774

リンク

2014/6/9(Mon) 20:38:14|NO.62381

対策としてはモジュール毎に名前を付ける方が楽そうな気がします。
いちいち名前を考えるのが面倒でしたら

#define global mn %t____m____ %n
とかuserdefに作って振ってけばいいですし。



あり

リンク

2014/6/9(Mon) 21:02:23|NO.62382

あまり遭遇する事のない不具合ですが
遭遇すると混乱必至なので要修正ではありますね。

#module mod1 #deffunc Test str mod1 mes mod1 return #global s = "test" Test s mod1 + 1 Test s
つまり、モジュール名と同じエイリアス名が
ダメという事ですね。



GENKI

リンク

2014/6/9(Mon) 21:47:21|NO.62383

> >今回のように判断難しければ、wikiよりBBSがいいかと。見る人も書き込む人も多いですし
> 僕に対してですか?wikiって書いているので僕に対してですよね

あ。
まとめだけwikiに上げるということでしたか。むしろそれがいい。
私は、議論もwikiでやろうよ、という話かとなぜか勘違いしてました。^_^;
上の私の引用、主語は「議論」です。


さて、話を戻します。
正規表現で簡単に置換できないか考えてみましたがいい記述を思いつきませんでした。orz
将来過去のソースをコピべするケースを考えたりするとやはり…と考えてしまいます。



check

リンク

2014/6/10(Tue) 14:55:24|NO.62388

なるほど、堀木氏が言っていたのはそういうことか。
確かにこの仕様はこれはバグの原因になりかねないなぁ。

うーん……いい解決案が見つからないな。
HSP4で変数はすべて参照カウンタとマーク&スイープ方式を使って
ガベージコレクションが行われる仕様になることを期待するか……(希望的観測)



skyblue

リンク

2014/6/10(Tue) 17:06:25|NO.62389

>NO.62388
ただでさえ遅いって言われているのに拍車をかけそう。



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