|
|
2011/4/9(Sat) 19:39:14|NO.38272
mesbox等に入力された文字列を別の文字列に変換するようなソフトを作ろうと思います。
たとえば、「い」と入力してボタンを押したら「B」になったり
「あいうえお」と入力すれば「ABCDE」となるようにしたいのですが
このようなことは可能でしょうか?
|
|
2011/4/9(Sat) 20:06:55|NO.38273
じゃあ、ボタンが押されたらmesbox内を解析して、
変数に"ABCDE"を入れた状態で、
objprmでも使ってmesboxの中身を変えちゃえばいいんじゃないですか?
一応サンプル作ってみました。
これで本当に質問者さんのしたいことができているのだろうか?意味を取り違えていないか心配です。
screen 0,640,480
mb = "この中に適当に文字入れてね。\nんで、ボタンを押すと「あ」が「A」になるかもしれないよ。"
objsize 640,30
mesbox mb, 640, 450 : mbid = stat
button "変換開始!!!", *henkan
stop
*henkan
split mb, "あ", results
mb = ""
repeat
mb += results(cnt)
if cnt == length(results)-1 : break
mb += "A"
loop
objprm mbid, mb
stop
|
|
2011/4/9(Sat) 20:17:31|NO.38274
このような感じですが
以下のように
「あ」→「A」
「い」→「B」
「う」→「C」
「え」→「D」
「お」→「E」
複数の文字を変換できるようにはできませんか?
|
|
2011/4/9(Sat) 20:48:23|NO.38275
>複数の文字を変換できるようにはできませんか?
その質問に答えましょう。できます。
早く言えば、これを何度も繰り返せばよいのです。
あと残りは頑張ってください。
こんな質問をしたんですから、mesboxやbutton,objsize の意味はわかりますよね?
あとsplitとlengthとobjprmなんかとかのうち、あなたがわからない命令をHDLで調べて、
このスクリプトを理解しようとすればいくら僕のスクリプトとはいえ、今回のは難しくはありません。(と信じたい。)
|
|
2011/4/9(Sat) 23:04:42|NO.38276
規格では文字コードの連続は保証されていない可能性があるので、
こんなやり方はどうでしょう?
switch moji
case "あ":
moji = 'A'
break
case ....
<以下省略>
....break
default
break
swend
|
|
2011/4/10(Sun) 09:15:59|NO.38280
>>f3dさん
まあ、僕は文字の配列変数で対応表でも作って頑張ればいいかな〜なんて思ってたんですけど。
>switch moji
>case "あ":
> moji = 'A'
> break
>case ....
><以下省略>
>....break
>
>default
> break
>swend
mojiが"あ"だったとき、mojiに65を入れてからどうするのですか?
僕質問者じゃないですけど、続きが知りたいです。
|
|
2011/4/10(Sun) 22:27:59|NO.38325
なかなか難しそうですががんばってみます
一応未解決にしておきます
|
|
2011/4/11(Mon) 01:24:56|NO.38326
どこか解決してない要素があるのか?あるなら速やかに明確化しないと回答者が困る。
無いならとりあえず解決にしておかないとやっぱり回答者が困る。
|
|
2011/4/11(Mon) 08:44:31|NO.38327
過去ログの25136あたりで書いたモジュールがきっと使えるんだぜ!
|
|
2011/4/11(Mon) 18:09:07|NO.38330
>SYAMさん
#module
#define INTMAX 0x7ffffff
// multireplace() : 入力文字列内の文字列を置換して返す.
// s : 入力文字列.
// srch : 検索文字列の配列.
// rep : 置換文字列の配列.
// nbword : 検索、置換文字列配列の要素数.
#defcfunc multireplace str s, array srch, array rep, int nbword
src = s
dest = ""
dim srchidx,nbword
srch_end=0 // 検索し終えた区切り文字の数.
repeat nbword
srchrator=srch(cnt) : index=0
gosub *GET_NEXTINDEX : srchidx(cnt)=i
loop
*CUTTING_NEXT
if(srch_end<nbword){
nextidx=INTMAX
repeat nbword
if(srchidx(cnt)<nextidx){
nextidx=srchidx(cnt)
minidx=cnt
}
loop
srchlen=strlen(srch(minidx))
dest += strmid(src, idx, nextidx-idx) + rep(minidx)
idx=nextidx+srchlen
repeat nbword
if(srchidx(cnt)=nextidx){
srchrator=srch(cnt) : index=idx
gosub *GET_NEXTINDEX : srchidx(cnt)=i
}
loop
goto *CUTTING_NEXT
}
dest += strmid(src, idx, INTMAX);
return dest
*GET_NEXTINDEX
i=instr(src, index, srchrator)
if i<0 : i=INTMAX:srch_end++:return
i=index+i:return
#global
これですね。全く使い方が分かりませんががんばってみます。
ありがとうございました
|
|
2011/4/11(Mon) 18:52:49|NO.38332
こうやって つかうのです。
sdim in,10240
mesbox in,640,,,10239
button "REPLACE",*START
stop
*START
search = "犬","鼠","兎","鳥","象"
replace= "猫","ねこ","ネコ","CAT","猫様"
dest = multireplace(in, search, replace, 5)
objprm 0,dest
stop
|
|
2011/4/11(Mon) 21:56:11|NO.38334
これはとても素晴らしいスクリプトですね。
いつか中身を理解できるようになりたいです。
ありがとうございました
|
|
2011/4/12(Tue) 01:33:52|NO.38335
少し悩んだことがあったので書き込みます。
解決済みなので返信が来なければ新しく立てさせていただきます。
SYAMさんのスクリプトを応用しています。
文字置換の変数を一行に収めるのが困難なので複数行にしようと思います。
sdim search,100,10
sdim replace,100,10
search.0 = "あ","い","う","え","お"
replace.0= "A","B","C","D","E"
search.5 = "か","き","く","け","こ"
replace.5= "F","G","H","I","J"
このようにしているのですが、これだと[か行]の変換がされません。
どのようにすれば複数行にできるのでしょうか?
|
|
2011/4/12(Tue) 14:12:01|NO.38338
multireplace()関数 の使い方が最初のほうのコメントに書いてあります。
4つめの引数(サンプルで 5 にしてるやつ)は、検索キーワードの個数です。
5 のままにしてたら、あ〜お の5つしか検索しません。そうなっていませんか?
|
|
2011/4/12(Tue) 16:34:02|NO.38342
その通りでした
ありがとうございます
|
|