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


HSPTV!掲示板


未解決 解決 停止 削除要請

2024
0206
buhioswitchの代わりにrepeat 1~loop6解決


buhio

リンク

2024/2/6(Tue) 17:08:52|NO.101164

皆さんコンニチワ

 HSPのswitch文だと、case条件に詳細なルールを設けられない(と思っている)ため、
 repeat文を代用しているのですが、おかしいでしょうか?
 今のところ特に問題はなく、gotoで抜けないように注意する程度です。
 
 あるいは、switch文で同じようなことができるのでしょうか?

 

a=0  b=0  repeat 1 //1回だけ実行 if (a=1)&(b=1):mes "1":break if (a=2)&(b=1):mes "2":break if (a=3)&(b=1):mes "3":break mes "条件を満たしませんでした" loop  stop  



この記事に返信する


沢渡

リンク

2024/2/6(Tue) 17:32:45|NO.101166

これは良いアイディア…!
サブルーチンやユーザ定義命令・関数ですと、
if文で条件を満たした時にreturnして「以降のことはもう関係ないよ」
とするのをよくやりますが、サブルーチンでない場合でも
repeatとbreakを使って同じようなことができたとは…。

ちなみに、switch文でも似たようなことはできなくもありません。
switch文やcase文はhspdef.as内で定義されたマクロで、
hspdef.asの中身を見ますと、
・switch文の引数を"_switch_val"という変数に入れる。
・case文の引数と"_switch_val"を比較し、同じであればcase以降を実行する。
という流れになっていますので、たとえば以下のような書き方も
できなくはありません。
(実用性があるかどうかはともかく)

a=0 b=0 switch 1 case a=1 & b=1 mes "1" swbreak case a=2 & b=1 mes "2" swbreak case a=3 & b=1 mes "3" swbreak default mes "条件を満たしませんでした" swbreak swend



usagi

リンク

2024/2/6(Tue) 21:29:02|NO.101167

こんにちわ。
repeat 1で見ただけで1回だけ実行と分かるので、読みやすさ的にもおかくないのではないでしょうか。
別案だと、ループ中だとcntの退避、おっしゃられるgoto使えない所もあるので、
数多ければローカルラベルを使うか、少なければelse:ifを使うやりかたはよく書いてます。

ですが。。。
↓の様に見比べてみると見た目的に分かりにくいので提示されてるスクリプトは
条件次第ではすっきりして良いのではないでしょうか。


a=0:b=0 if (a=1)&(b=1):mes "1":goto *@f if (a=2)&(b=1):mes "2":goto *@f if (a=3)&(b=1):mes "3":goto *@f mes "条件を満たしませんでした" *@


a=0:b=0 if (a=1)&(b=1) { mes "1" } else:if (a=2)&(b=1) { mes "2" } else:if (a=3)&(b=1) { mes "3" } else { mes "条件を満たしませんでした" }



GENKI

リンク

2024/2/7(Wed) 00:20:39|NO.101168

一見変な書き方だけど、見やすくていいですね。
本来の命令の用途と異なるので、何となくこう書きたくなります。

a=1 b=1 gosub *sw stop *sw if (a=1)&(b=1):mes "1":return if (a=2)&(b=1):mes "2":return if (a=3)&(b=1):mes "3":return mes "条件を満たしませんでした" return
しかしこれだと離れた場所に書く必要があるので、読みにくくなってしまいますね。


普段の私なら…switchで無理やり書いてしまいそうです。

a=3 b=0 switch ((a=1)<<3) | ((a=2)<<2) | ((a=3)<<1) | (b=1) case 1<<3 | 1 mes "1" swbreak case 1<<2 | 1 mes "2" swbreak case 1<<1 | 1 mes "3" swbreak default mes "条件を満たしませんでした" swend
repeat使った方がすっきりする。



窓月らら

リンク

2024/2/7(Wed) 02:59:58|NO.101169

repeat のその使い方もアリです。
repeat 1 とはしませんが、私も似たような使い方をすることがあります。

switch〜case は hspdef.as で定義されているマクロです。
以下がそれですが、これを見れば展開後どうなるかわかると思われます。

#define global switch(%1) %tswitch %i0 %s1 _switch_val=%p : if 0 { #define global case(%1) %tswitch _switch_sw++} if _switch_val == (%1) | _switch_sw { _switch_sw = 0 #define global default %tswitch } if 1 { #define global swbreak %tswitch goto *%p1 #define global swend %tswitch %o0 } *%o



buhio

リンク

2024/2/7(Wed) 09:41:19|NO.101170

皆さん色々とswitchの書き方例を提示いただきありがとうございます。

 どうもswitch文というかマクロは苦手なので、TPOに応じてrepeatで代用していこうと思います。
 ローカルラベルについては、まだよく理解していないので、調べてみようと思います。
 



usagi

リンク

2024/2/7(Wed) 17:51:27|NO.101171

わぁ、いろいろあって面白いですね。
たしかにreturn使いたかったらGENKIさんの様に書いていたかも。。。
という事で、インラインで書きたい気持ちでマクロ化してみました。
(switchは予約されてるので仮にbranchとしました)

#define global branch gosub %tbrs *%i : goto %tbre *%i : %tbrs *%o #define global brend %tbranch %tbre *%o ; ↑これをhspdef.asなどに書いておく a=0:b=0 branch if (a=1)&(b=1):mes "1":return if (a=2)&(b=1):mes "2":return if (a=3)&(b=1):mes "3":return mes "条件を満たしませんでした" brend

>buhioさん
ローカルラベルはラベル名考えるの面倒な時と簡単な分岐の時に使ってるのですが、
保守管理敵に混乱あるかもなので、今回のマクロの方がシンプルかもです。すみません。
あと今回のはスタック使っているので、ネストできます。



記事削除

記事NO.パスワード
(質問が解決したスレッドは他の利用者に活用してもらうため、削除しないようお願いします)

NO.101164への返信

マスコット

好きなマスコットを選んでください。

名前

e-mail
HOME
  1. 初めて利用する方は、HSP3掲示板の使い方をお読みください。
  2. 不要部分の多い長いスクリプトの投稿は ご遠慮ください。
  3. 書き込みは自動改行されません。適度に改行を入れてください。
  4. スクリプトは小文字の<pre>〜</pre>で囲むと見やすく表示できます。

削除用パスワード

解決したら質問者本人がここをチェックしてください。

エラー発生時、再送信すると二重送信になることがあります。
回答が得られたら、お礼書き込み時に[解決]チェックしてください。
SPAM防止のためURLから始まる文章は投稿できません。
SPAM防止のため英文字のみの本文を投稿することはできません。

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