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


HSPTV!掲示板


未解決 解決 停止 削除要請

2024
0812
kinokawaラベル型変数について8解決


kinokawa

リンク

2024/8/12(Mon) 18:50:36|NO.102036

ラベル型変数について質問なのですが

ldim label,10 label(0) = *LA00,*LA01,*LA02,*LA03,*LA04,*LA05,*LA06,*LA07,*LA08,*LA09,*LA10 repeat 0 *LA00 *LA01 : mes "test01": return *LA02 : mes "test02": return *LA03 : mes "test03": return *LA04 : mes "test04": return *LA05 : mes "test05": return *LA06 : mes "test06": return *LA07 : mes "test07": return *LA08 : mes "test08": return *LA09 : mes "test09": return *LA10 : mes "test10": return loop repeat 10 gosub label(cnt+1) loop
こういう感じでラベル型変数を定義するときにラベルの数が
増えてくると定義の部分がどんどん長くなってしまって
入力し辛いです

repeat 10
label(cnt) = *LA+cnt
loop

のような書き方、あるいは似たような方法があれば
教えていただきたいのですが、
いい方法がありますでしょうか
よろしくお願いします



この記事に返信する


ruri_fun

リンク

2024/8/12(Mon) 22:13:22|NO.102038

作ってみました。お役に立てれば幸いです。

ldim label,50
repeat 50
label(cnt) = "*LA"+str(cnt)
loop
gosub *LA0
gosub *LA9
gosub *LA45
gosub *LA15
stop
*LA0
mes "1"
return
*LA9
mes "9"
return
*LA15
txt="LA15"
*LA45
mes txt+"&LA45" :txt=""
return



kinokawa

リンク

2024/8/12(Mon) 22:28:38|NO.102039

ありがとうございます。
この方法でうまく出来そうです、本当に助かりました(^^



kinokawa

リンク

2024/8/12(Mon) 22:39:35|NO.102040

すいません、ちゃんとスクリプトをみていませんでした(^^;
gosub ラベル変数 で 実行したかったので

ldim label,50 repeat 50 label(cnt) = "*LA"+str(cnt) loop gosub label(0) gosub label(9) gosub label(45) gosub label(15) stop *LA0 mes "1" return *LA9 mes "9" return *LA15 txt="LA15" return *LA45 mes txt+"&LA45" :txt="" return
という風にスクリプトを変更したらうまく動きませんでした(^^;



ruri_fun

リンク

2024/8/13(Tue) 00:17:48|NO.102042

思いつくままにいくつか試してみましたが私の実力不足で解決する方法が見つかりませんでした。
今回の件の解決に結びつくかわかりませんが同じように悩んでいた方がいたようですので載せておきます。
https://hsp.tv/play/pforum.php?mode=pastwch&num=65587



zrs90(5さい)

リンク

2024/8/13(Tue) 01:41:53|NO.102043

見当違いかも知れませんが
過去記事にこんな方法が載ってました

http://www.hsp.tv/play/pforum.php?mode=pastwch&num=39447



MIZUSHIKI

リンク

2024/8/13(Tue) 05:54:17|NO.102045

zrs90(5さい)さん の言うように、スクリプトを使ってテキスト出力したものをコピペした方が見やすいし理解しやすいような気もしますが一応作ってみました。

#define ctype LA_Label(%1) %tLA label(%1) = *%i : if 0 : *%o : if 1 ldim label,50 LA_Label( 0) : LA_Label( 1) : mes "test01" : return LA_Label( 2) : mes "test02" : return LA_Label( 3) : mes "test03" : return LA_Label( 4) : mes "test04" : return LA_Label( 5) : mes "test05" : return LA_Label( 6) : mes "test06" : return LA_Label( 7) : mes "test07" : return LA_Label( 8) { // 複数行使いたいときは中括弧でくくる mes "test08" return } LA_Label( 9) : mes "test09" : return LA_Label(10) : mes "test10" : return repeat 10 gosub label(cnt+1) loop

#define の特殊展開マクロを使ってるので実態を理解するのが難しいと思います。
実際には下記のように展開されます。

LA_Label(id)



label(id) = *_LA_0000: if 0 : *_LA_0000: if 1


注意点として、label配列にラベル名を代入していかないといけないので一度だけこれらの行を通っておく必要があります。
もし label 以外の変数名にしたいときは #define 行の中の「label」部分を書き換えてください。

【 ちょっとだけ解説 】
#define の特殊展開マクロなのでコンパイル時点で位置関係の順番にラベル名が決まり、各行で *_LA_0001 ... と数値が増えていきます。(16進数)
#define内の %t, %i などの詳細が知りたい場合は #define のヘルプを参照してみてください。



MIZUSHIKI

リンク

2024/8/13(Tue) 09:16:17|NO.102046

連投すみません。
よくよく考えてみたらこうすれば変数も指定できて汎用性高く出来るかも、と思い直しました。

#define ctype LA_(%1,%2) %tLA %1(%2) = *%i : if 0 : *%o : if 1 ldim label, 50 LA_( label, 0 ) : return LA_( label, 1 ) : mes "test01" : return LA_( label, 2 ) : mes "test02" : return LA_( label, 3 ) { // 複数行使いたいときは中括弧でくくる mes "test03" return } LA_( label, 4 ) : mes "test04" : return LA_( label, 5 ) : mes "test05" : return ldim label2, 50 LA_( label2, 0 ) : return LA_( label2, 1 ) : mes "test01-2" : return LA_( label2, 2 ) : mes "test02-2" : return LA_( label2, 3 ) : mes "test03-2" : return repeat 5 gosub label(cnt+1) loop repeat 3 gosub label2(cnt+1) loop
マクロ名が LA_ だと短すぎて他とぶつかる可能性高くてイマイチなので何か良い感じの名前に変えて使ってください。



kinokawa

リンク

2024/8/13(Tue) 11:08:15|NO.102047

ruri_funさん、zrs90(5さい)さん、MIZUSHIKIさん
コメントありがとうございます。

MIZUSHIKIさんのスクリプトを少し変更して
以下のようにすることで、入力がすごく楽になりました。
本当にありがとうございました。

#define ctype LA_Label(%1) %tLA label(%1) = *%i : if 0 : *%o : if 1 #define def LA_cnt++:LA_Label(LA_cnt) ldim label,50 LA_cnt=0:LA_Label(LA_cnt) def : mes "test01" : return def : mes "test02" : return def : mes "test03" : return def : mes "test04" : return def : mes "test05" : return def : mes "test06" : return def : mes "test07" : return def : { // 複数行使いたいときは中括弧でくくる mes "test08" return } def : mes "test09" : return def : mes "test10" : return repeat 10 gosub label(cnt+1) loop



記事削除

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

NO.102036への返信

マスコット

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

名前

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

削除用パスワード

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

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

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