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


HSPTV!掲示板


未解決 解決 停止 削除要請

2016
0421
T.y簡単なことだと思うんですが....11未解決


T.y

リンク

2016/4/21(Thu) 16:47:31|NO.75280

初めましてT.yです
コマンドソフトを作りたいのですが、例えば/me wwaと打ちwwaと表示させるにはどうすればよいのですか?
本当に簡単な質問ですみません



この記事に返信する


KA

リンク

2016/4/21(Thu) 17:56:08|NO.75282

適当に作るとこんな感じです


A="/me wwa" B="" C="" memcpy B,A,3,0,0 memcpy C,A,3,0,4 if B="/me" : mes C



Velgail

リンク

2016/4/21(Thu) 21:31:54|NO.75284

用途を考えて、私ならこのように。


in="/me wwa" //ここからパーサー itr=0//見ている場所 if (strmid(in,itr,1)="/"){ itr++//一つ動かす(つまり仮想的に見える文字列は"me wwa"と考えておく fitr=instr(in,itr," ")//区切り文字(今回は半角スペース)の場所を探す if(fitr<0){ mes "エラー:コマンドが見つかりません"//コマンドだけの場合はこちらに回すという処理系統にしてみた }else{ cmd=strmid(in,itr,fitr)//コマンド文字列を代入しておく。 itr+=fitr+1//仮想的に見える文字列を"wwa"にするように、見ている場所を動かす switch cmd//コマンドに合わせて動作を行わせる case "me" mes strmid(in,itr,strlen(in))//ここで表示 swbreak//稀に良く忘れる default mes "エラー:コマンドが存在しません"//テンプレ swend } }else{ mes "エラー:コマンド指定子が見つかりません"//コマンドがないパターン(/を検出できなかったとき) }



Humi/bass_clef_

リンク

2016/4/25(Mon) 11:41:22|NO.75313

区切り文字が半角空白固定なら split が使えますよ


text = "/me wwa" split text, " ", prm switch prm.0 case "/me" mes prm.1 swbreak swend



Velgail

リンク

2016/4/25(Mon) 19:22:31|NO.75316

>splitが使えます
使えると考えないほうがいいかと。
"/me Hello World!"
ってやった時の動作がひどいことになるので



GENKI

リンク

2016/4/25(Mon) 21:21:17|NO.75319

> コマンドソフトを作りたいのですが、例えば/me wwaと打ちwwaと表示させるにはどうすればよいのですか?
簡単な質問というのをヒントに考えてみました。

#runtime "hsp3cl" input s, 256, 2 if s = "/me wwa" { mes "wwa" } else { mes "input error !" } mes "END"
コンソール版HSPを使ったのは初めてだったので以外に手こずりました!(`・ω・´)



InoueSoftwear

リンク

2016/4/26(Tue) 10:21:49|NO.75325

> "/me Hello World!"ってやった時の動作がひどいことになるので
検索機能を使うとできます。

text="/me Hello World!" input text,200,28 input text2,200,28 onkey *key *key index=instr(text,0," ")//スペースを検索 text2=strmid(text,index+1,strlen(text))//スペースから先を抜き出す objprm 1,text2 stop



Velgail

リンク

2016/4/26(Tue) 15:24:51|NO.75326

NO.75284見てませんね。
もう検索(というかinstr)使ってますよ。その上でstrmidで云々言うから、ダメだと言っただけで。



Humi/bass_clef_

リンク

2016/4/26(Tue) 19:16:03|NO.75329

>Velgailさん
>>使えると考えないほうがいいかと。
>>"/me Hello World!"
>>ってやった時の動作がひどいことになるので
たしかにあのままの何も工夫しない状態だとそのような動作になりますね

>InoueSoftwearさん
なにも検索する必要なんてないんですよ

"/me Hello World!"

の Hello と World の間にある空白が区切り文字ではない
つまり /me の引数は一つしかなくてその引数を"Hello World!"と考えるなら
結合してしまえばいいことなのでは?

#enum CMD_ME = 0 #enum CMD_MES cmd = "/me", "/mes" cmdParamLen = 1, 1 cmdLength = length(cmd) text = "/me く う は く な ん て な ん の そ の" // text = "/mes く う は く な ん て な ん の そ の" // text = "/mes く" split text, " ", prm prmLength = length(prm) dim cmdCount, cmdLength repeat prmLength for i, 0, cmdLength, 1 if cmd.i == prm.cnt { cmdCount.i++ if cmdCount.i < cmdParamLen.i :_continue cmdId = i gosub *findCommand } next loop stop *findCommand switch cmdId case CMD_ME if cmdParamLen.cmdId < prmLength-1 { repeat prmLength-cmdParamLen.cmdId-1, cmdParamLen.cmdId+1 prm.cmdParamLen(cmdId) += " "+ prm.cnt loop } mes "["+ prm.1 +"]" swbreak case CMD_MES if cmdParamLen.cmdId < prmLength-1 { mes "引数が多いです" swbreak } mes "["+ prm.1 +"]" swbreak swend return

私はなにも可能性の一つを提示したにすぎません
このコードで何か新しい考えをスレ主に提供するだけです。
スレ主自体が否定するならともかく、
他の人が安易にその新しい考えを つむ or 否定 するべきではないんではないでしょうか
一番いい方法を求めているわけではないでしょうし、
色々な命令の使い方を知っておくのも、のちの自分のためにもなるやもしれませんし

長文しつれいしました。



KA

リンク

2016/4/26(Tue) 21:00:11|NO.75331

>>このコードで何か新しい考えをスレ主に提供するだけです。

同感です。

スレ主がどの程度の仕様で考えているのか分からない以上は、複数の
方法を提示して選択肢を増やすのは悪いことではありません。

スレ主不在で勝手に仕様を議論しても始まりません。



GENKI

リンク

2016/4/26(Tue) 21:16:41|NO.75332

あらためて作りなおしてみました。今回はまじめです。
strtrimでお掃除は大事だと思います。

#runtime "hsp3cl" sdim s, 256 sdim c, 256 sdim p, 256 *main ; 入力待ち input s, 256, 2 if peek(s,0)='/' { ; コマンドと引数を分離 i = instr(s,0," ") if i<0 { c = s p = "" } else { c = strmid(s,0,i) p = strmid(s,i,strlen(s)) p = strtrim(p,0,' ') } ; コマンドごとの処理 cflg = 0 if c = "/me" : cflg = 1 : mes "" + p if c = "/exit" : cflg = 1 : goto *owari if cflg = 0 : mes "'" + c + "'は、コマンドとして認識されていません。" } goto *main *owari end

あとは引数の処理を頑張らないとですね。
やり方はもうほかの方がいろいろと説明してくれているのを参考にすると良さそうです。splitとか便利そうですね。
実装はいろいろです。お好みでどうぞ。



Y_repeat(旧y.tack)

リンク

2016/4/29(Fri) 16:19:44|NO.75347

やっぱり区切り文字が欲しいところですよね

ないならないで
Lispのように最初の文字列を命令とするのか
split感覚で全部区切っちゃうのか 解釈は異なるのは自然なことかもですよね



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