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


HSPTV!掲示板


未解決 解決 停止 削除要請

2016
0522
UNGAbutton gosub の内部処理について5解決


UNGA

リンク

2016/5/22(Sun) 18:21:58|NO.75548

下のようなスクリプトを、組んでみました。
目論見どうり押下毎に再生/停止できるのは良かったのですが、これって、
内部の処理はどうなっているのでしょう?同じルーチンが2度目に呼ばれたとき、
最初のルーチンは消失してしまうのでしょうか?
button gosub "ループ再生/停止",*auto
*auto
if auto_f=0 { auto_f=1 } else { auto_f=0 }
repeat 10000
if auto_f=0 : break
gosub *next_
wait 150
loop
return



この記事に返信する


KOMARI

リンク

2016/5/23(Mon) 13:10:36|NO.75557

これはいいひっかけ問題だ(・ω・)結構悩んでしまった。

このソースをそのまま上から読みます。
開始時点でlooplev==0,sublev==0とします。
("="は代入、"=="は比較として書いている)

1. ボタンの設置 2. auto_f = 1 3. repeat内へ (looplev==1,sublev==0) 4. ボタンを押すと"wait150"のタイミングで*autoへ (looplev==1,sublev==1) (*next_へ最低一回は飛ぶ) 5. auto_f = 0 6. repeat内へ (looplev==2,sublev==1) 7. auto_f==0 なので break (looplev==1,sublev==1) 8. return (1回目のrepeat内へ)(looplev==1,sublev==0) 9. auto_f==0 なので break (looplev==0,sublev==0) 10. return あれれ?sublev==0でreturnってなーにー?
ということでエラーが出るみたいです。

このソースへの突っ込みが何点か。
・単に、ボタンを押すたびに再生と停止を切り替えたいなら、別の方法がありそう(後述)
・repeat 10000が終わると、自動的にエラー吐かれるけどいいんですか?

何も考えず(?)書き直してみたソースがこちら。

button gosub "ループ開始/停止",*auto gosub *auto *auto_ repeat if (auto_f) : title "処理中" : else : break //ここに処理をいれる gosub *next_? wait 1 loop repeat if (auto_f) : break : else : title "停止中" //なにもしない wait 1 loop goto *auto_ stop *auto auto_f ^= 1 //if auto_f=0 { auto_f=1 } else { auto_f=0 }と同意 return
正直気持ち悪いですねえ。
停止用のリピートとか置きたくないよって言われそう。

そもそも「ループの再生(停止)」の定義ってなんでしょうか。
1. ボタンを押したらループ外へ出る
2. ボタンを押したらループ内の処理が行われなくなる
とか考えられるわけですが。
上に書いたのは1.の定義に沿ったわけです。(UNGAさんはこっちを意識してると解釈した)

さて、私が組むなら2.を採用して次のようにソースを書きます。

button gosub "ループ開始/停止",*auto button gosub "ループ解除",*rbreak gosub *auto repeat if (rb) : break title tmes if (auto_f) { //ここに処理をいれる gosub *next_? } wait 1 loop title "ループ終了" stop *auto auto_f ^= 1 if (auto_f) : tmes = "処理中" : else : tmes = "停止中" return *rbreak rb = 1 return
幾分かすっきりしたようにも思えます。
ここではループを抜ける手段がないので、rbreak(repeat breakの意)なるものを用意しておきました。

以上です、参考になりましたでしょうか。
実際この構造を何に使いたのかが分からないので、役に立たなかった場合はごめんなさい(・ω・;)



UNGA

リンク

2016/5/23(Mon) 19:05:03|NO.75558

丁寧にご教示いただき恐縮です。
最後のスクリプトがすっきりしていてよさそうですね。

ところで、一つお詫びです・・・。
質問に上げたスクリプトですが、実は下のようになっていました。
簡略化しているうちに行を削りすぎてしまったようです。
申し訳ありませんでした。

screen 1
button gosub "ループ再生/停止",*auto
stop

*auto
if auto_f=0 { auto_f=1 } else { auto_f=0 }
repeat 10000
if auto_f=0 : break
gosub *next_
wait 150
loop
return

 (スクリプト部分を青色に表示させるにはどうしたらよいのでしょう・・・)



UNGA

リンク

2016/5/30(Mon) 22:14:08|NO.75657

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



スペース

リンク

2016/5/31(Tue) 10:48:16|NO.75661

投稿フォームの上の所(削除用パスワードの横)に、スクリプトは小文字の~と書いていますよ。



UNGA

リンク

2016/6/4(Sat) 05:59:21|NO.75697

「4.スクリプトは小文字の
で囲むと見やすく表示できます。」
見落としていました。 ありがとうございます。



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