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


HSPTV!掲示板


未解決 解決 停止 削除要請

2010
0107
catサブルーチンジャンプの後にボタン9解決


cat

リンク

2010/1/7(Thu) 21:11:21|NO.29817

こんばんは、catです。
質問です。

なぜ、gosubの後にbuttonでさらに飛び、その後にreturnで帰れないのでしょうか。
良い解決法をお教えいただければ嬉しいです。

↓スクリプト


gosub *a ;aに飛ぶ end *a button "ボタン",*b ;bに飛ぶボタン stop *b return ;ここでエラー ;本当なら2行目に飛ぶはず…



この記事に返信する


cat

リンク

2010/1/7(Thu) 21:15:17|NO.29819

すいません。Tabが変になっていました。


gosub *a ;aに飛ぶ end *a button "ボタン",*b ;bに飛ぶボタン stop *b return  ;ここでエラー          ;本当なら2行目に飛ぶはず…

上のは一応HSPスクリプトエディタに貼り付けると普通ですが、見やすいように念のため
もう一個貼っておきます。

どうか、よろしくお願いします。
なぜできないのでしょうか。



腱鞘炎

リンク

2010/1/7(Thu) 21:58:23|NO.29820

button "ボタン",*b

button gosub "ボタン",*b
にしてみてください。



inovia

リンク

2010/1/7(Thu) 22:09:19|NO.29821

gosub で飛んだフラグ *a を stop命令で止めてしまっているのも原因のひとつです。

goto は stop
gosub は return
と対応していないといけません。

というか、やりたいことがよくわかりません。
もしかしてこういうこと?


gosub *a stop *a button gosub "ボタン",*b return *b end return



cof

リンク

2010/1/7(Thu) 22:59:51|NO.29822

ボタンを押すと

---------------------------
Error
---------------------------
#Error 10 in line 7 (???)
-->サブルーチン外のreturnは無効です

---------------------------
OK
---------------------------

とエラーが出ますね。メッセージのままだと思います。

あとリファレンスに
>ボタン表示
>button goto/gosub "name",*label
>goto、gosubキーワードを省略した場合には、gotoと同じ動作になります。
とあります。



SYAM

リンク

2010/1/8(Fri) 13:27:11|NO.29824

gotoやgosubと違い、ボタンのジャンプはスクリプトの流れと無関係にジャンプする特殊なものです。
ユーザーはボタンをいつでも押せてしまうのですから、必ずサブルーチン実行中に押されるということは期待できません。
たとえば、 button goto 命令で配置したボタンのジャンプ先に return があると、サブルーチンでないところを実行中にそのボタンをおしたらアウトです。サブルーチン実行中ではないのにreturnに到達します。

ですから、ボタンは gosub でない無条件ジャンプのときには gosub のネストをクリアするようです。

button "test",*onbutton lv=0 *main title "return " + lv +" times" gosub *sub *sub stop *onbutton lv++ goto *main

returnに到達することなく つぎのgosub に行き当たったとき、gosub はネストします。
このネストは、HSPでは127回まで。
つまり、returnせずに 128回目のgosubに行き当たるとエラーになる仕様のはずです。

このスクリプトでは、ボタンを押すと最初に戻って同じサブルーチンに入ります。
つまり returnなしで再度 gosub に入ります。が、128回以上いけるはずです。
また、ボタンの処理の中で return しようとするとエラーになるはずです。


つまり、button命令でジャンプするとき、HSPはサブルーチン実行中だったということを忘れます。
…しばらく扱ってるとそのほうがいいって思えるかもしれません。
サブルーチン実行中にボタンが押されて、その処理の先にreturnがなかったらおかしくなるとか面倒をみなくてはならないよりは、ボタンを押されたら何も考えずにボタンの処理をして、適当な処理に復帰できるほうが。。。



通りすがり

リンク

2010/1/8(Fri) 13:33:10|NO.29825

クリックされるとgosubから戻って来ます。


gosub *a end *a stick key if key&256 : return wait 1 goto *a

こういうのをボタンでやりたいんですよね?
色々試行錯誤してみましたが、私にはこれが限界でした。


gosub *a ;aに飛ぶ end *a flg=0 button gosub "ボタン",*b *@ if flg : return wait 1 goto *@b *b flg=1 return



通りすがり

リンク

2010/1/8(Fri) 13:42:17|NO.29826

書いてる間にSYAMさんがまともな回答をされてましたね。

ネストレベルを表示するだけの粗末なものを作ってみました。

gosub *a *a mes sublev button "sublev?",*b stop *b mes sublev stop



cat

リンク

2010/1/8(Fri) 20:35:13|NO.29835

皆さん丁寧な御回答ありがとうございます。
僕は今までbutton gosubというのを知りませんでした。
もっとたくさん勉強したいと思います。

本当にありがとうございました。



cof

リンク

2010/1/8(Fri) 21:47:47|NO.29836

解決済みで蛇足ですが、
SYAMさんの
>このネストは、HSPでは127回まで。
は、HSP3.2では255回でエラーとなるようです。

また、stop命令でもbutton goto時と同様にスタックが破棄されるのですね。
ドキュメントライブラリに記載の無い内容で参考になりました。

…通常のgoto/gosubと同様の動作だろうと思ってました
別の動作をするものなのにスタックは共有してるのはちょっと怖い気がします



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