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


HSPTV!掲示板


未解決 解決 停止 削除要請

2010
0923
まつたけstrmid6解決


まつたけ

リンク

2010/9/23(Thu) 03:03:46|NO.35110

 下のスクリプトを実行した際に、画面が(というか文字が)ちらつきます。
 なぜでしょうか?

 皆さんの環境ではどうなりますでしょうか?


msg = "テストテストテストテスト\nてすとめっせーじだよ" repeat redraw 0 color 255,255,255 boxf color pos 0,0 mes strmid( msg , 0 , cnt ) getkey key , 13 await 30 redraw 1 loop



この記事に返信する


panda

リンク

2010/9/23(Thu) 03:10:46|NO.35111

strmid() 関数は1文字取り出す関数ではなく、1バイト取り出す関数のようです。
しかし、msgには2バイト文字が入っているために不正なデータが取得されます。
mes は '¥0' までの文字列を表示するために不正な領域から表示しようとします。

提示されたスクリプトの場合はすべて2バイト文字なので2バイトずつ読みこめばいいです。
1バイト文字2バイト文字が混ざっている場合は peek() 関数などで判定する必要があります。


msg = "テストテストテストテスト\nてすとめっせーじだよ" repeat redraw 0 color 255,255,255 boxf color pos 0,0 mes strmid( msg , 0 , cnt ) getkey key , 13 await 30 redraw 1 continue cnt+2 loop



まつたけ

リンク

2010/9/23(Thu) 05:18:48|NO.35112

pandaさん回答有難うございます。

 色々実行して気づいたのですが

自分の環境ではこのスクリプトを実行したところ。


msg = "めっ\nめっ\nめッ" slen = strlen(msg) sdim text , slen text = strmid(msg,0,3) mes text


画面に


 めd  めっ  めッ

の様に表示されました。
 変数 text をメモリダンプした内容を表示してみたところ。
 先頭三byteより下は、全てゼロとなっているので、異常としか思えません。

 strmid を memcpy に置き換えても同じ現象が起きます。

こうなったら、もう自分のパソコンがおかしいとしか思えません。

皆さんの環境でもこうなります試していただけますでしょうか?



たのひと

リンク

2010/9/23(Thu) 05:49:33|NO.35114

“っ”(小さい“つ”)も2byte文字(全角文字)です。

 text = strmid(msg,0,3)
スクリプト内で上のように書いていますが、これでは“っ”の半分までしかデータを取得できません。
つまり文頭から、2byte文字の“っ”の上位1byteだけがデータとして取得されたワケです。
そのため想定されない結果が返ってきているのです。

 text = strmid(msg,0,4)
と直せば、文頭から4byte分のデータを取得するので、2byte文字が2文字分…“めっ”…を取得し表示されます。

pandaさんの説明にもあるように、2byte文字(全角文字)を使う場合は2byteづつ処理しましょう。



まつたけ

リンク

2010/9/23(Thu) 06:37:43|NO.35115

>> panda さん
>> たのひと さん

有難うございます。
そしてすみません。

解決しました。



まつたけ

リンク

2010/9/23(Thu) 06:37:56|NO.35116

 



p、USAGI

リンク

2010/9/23(Thu) 06:52:28|NO.35117

	await 30
redraw 1
これ↑逆にした方がいいと思う。



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