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


HSPTV!掲示板


未解決 解決 停止 削除要請

2014
0209
しまくろねこHSP3Dish(Android実機上)でのinstr命令で正常な結果が返らない9解決


しまくろねこ

リンク

2014/2/9(Sun) 15:20:40|NO.59791

HSP3Dish(Android実機上)でのinstr命令についてご報告です。

HSP3Dishでspilit命令の代用 http://hsp.tv/play/pforum.php?mode=all&num=59724
HSP3Dish上でsplit命令が使えないためユーザ関数を作ってくださったスレがありました。
これは有りがたいと思い使用してみたところ、Android実機上では正常な結果が返ってこなかったため、自分でもsplit関数の代わりを作ってみたところやはり正常な結果が返ってきませんでした。
そこで両者のソースを調べたところ、マルチバイトを含む文字列をinstr命令で使用すると、返ってくる結果がAndroid上では不正確ということが分かりました。

下記の例では、

"あいうえお@かきくけこ"
"12345@67890"

の文字列内をinstr命令で"@"の位置を表示するサンプルですが、マルチバイトの文字列ではWindows上はinstr命令の結果は正常に返ってきますが、Android上になるとinstr命令の結果が「-1」が返ってきてしまいます。

#include "hsp3dish.as" a1 = "あいうえお@かきくけこ" a2 = "12345@67890" c1 = instr(a1, 0, "@") c2 = instr(a2, 0, "@") redraw 0 color 100, 100, 255 : boxf color 255, 255, 255 pos 0, 0 mes "" + c1 ; 結果(Windows: 10, Android: -1) Android上では「15」と出てほしい。 mes "" + c2 ; 結果(Windows: 5, Android: 5) 正常。 redraw 1 stop



この記事に返信する


しまくろねこ

リンク

2014/2/10(Mon) 22:46:25|NO.59843

HSPのバージョンを忘れておりました。
HSP3.4β3です。

以下はsplit命令の代わりのものです。

#deffunc dstr_split str buff, str dem, array re strpos = 0 strleng = 0 in_buff = buff i = 0 c = 0 y = 0 j = 0 lenms = strlen(dem) re = "" while c = instr(in_buff, y, dem) if c < 0 : _break strpos(i) = c + lenms strleng(i) = c y += strpos(i) i++ wend strpos(i) = 0 strleng(i) = strlen(in_buff) i++ repeat i re(cnt) = strmid(in_buff, j, strleng(cnt)) j += strpos(cnt) loop return i



MillkeyStars

リンク

2014/2/11(Tue) 01:19:28|NO.59866

Instrとしては、正常な挙動かな。
Android も HSPLet も、Instr はバグる。

文字コードの解釈の違いによるものと、うちは判断してるけどね。



しまくろねこ

リンク

2014/2/11(Tue) 18:52:48|NO.59895

こんにちわ。

訂正です。

>"あいうえお@かきくけこ"
>"12345@67890"
>
>の文字列内をinstr命令で"@"の位置を表示するサンプルですが、マルチバイトの文字列ではWindows上はinstr命令の結果は正常に返ってきますが、Android上になるとinstr命令の結果が「-1」が返ってきてしまいます。

の文字列内をinstr命令で1バイトの"@"の位置を表示するサンプルですが、マルチバイトを含む文字列ではWindows上はinstr命令の結果は正常に返ってきますが、Android上になるとinstr命令の結果が「-1」が返ってきてしまいます。


MillkeyStarsさん
>Android も HSPLet も、Instr はバグる。

このようなことと同じような現象でしょうか?

>文字コードの解釈の違いによるものと、うちは判断してるけどね。

後で確認してみますが、"@"の文字コードは

a1 = "あいうえお@かきくけこ"
で指定している"@"と

c1 = instr(a1, 0, "@")
で指定している"@"は同じ文字コードになると思います。
時間のあるときに同じ文字コードかどうか確認してみます。

別のことをおっしゃっていたのならごめんなさい。



MillkeyStars

リンク

2014/2/11(Tue) 19:50:14|NO.59896

まったく同じ現象が、HSPLet で起きたね。
その時は、Instr 自体を自作して対処したけど。

なぜか、Windows環境外でやるとバグる。

Instr(a1,0,"@") の "@" 部分をわざと、"@か"にして検索してみて。
もし、返値が 10である場合、「か」の前半バイトが@と合体した状態になっちゃってる可能性も。「@」単独として扱われていない。
この場合、判定プログラム自体がバグって事だから、おにたまさんに報告しつつ、それまでの対処は、Instr を自作するパターンかな。



MillkeyStars

リンク

2014/2/11(Tue) 20:25:47|NO.59897

って、回答してたら、No.59886 で作ってくれたみたいだね。
Android 用 Instr 命令。



しまくろねこ

リンク

2014/2/15(Sat) 10:16:49|NO.59981

こんにちわ。

文字コードが同じか調べてみました。
結果は同じ文字コードでした。
ということはAndroid上でのinstr関数に不具合がある模様です。
おにたまさんに報告したいと思います。

#include "hsp3dish.as" at = "@" a1 = "あいうえお@かきくけこ" a2 = "12345@67890" b = peek(at, 0) c1 = peek(a1, 15) c2 = peek(a2, 5) redraw 0 color 100, 100, 255 : boxf color 255, 255, 255 pos 0, 0 mes "" + b ; 結果(Android : 64) mes "" + c1 ; 結果(Android : 64) mes "" + c2 ; 結果(Android : 64) redraw 1 stop



qwerty

リンク

2014/2/15(Sat) 12:43:58|NO.59983

Cのソースとか見るとHSPのinstrを呼ぶとCのstrstr2が呼ばれて、
Cのstrstr2の中身みると「SJISのみ対応」と書かれているから
UTF-8のバイト列をShift_JISのバイト列として扱ってるんじゃないかとエスパーしてみる。
http://dev.onionsoft.net/trac/browser/trunk/package/win32/android/hspproj/jni/hsp3/ndk/supio_ndk.cpp#L169



check

リンク

2014/2/15(Sat) 15:24:38|NO.59992

qwerty氏が行っていることは正解に近いと思うぞ。
instrはiOS上でも正常に動作しなく、iOS上のstrstr2もSJISのみ対応と書いてある。
http://dev.onionsoft.net/trac/browser/trunk/package/win32/iOS/iHSP19/hsp3/ios/supio_ios.cpp

リンク先のページはブラウザによっては文字化けするので、
strstr2関数のコメントを書いておこう。

char *strstr2( char *target, char *src ) { // strstr関数の全角対応版 // 注意! : SJISのみ対応です // ... return NULL; }



しまくろねこ

リンク

2014/2/15(Sat) 15:56:08|NO.59995

qwertyさん
checkさん
こんにちわ。
ありがとうございます。

なるほどです。
UTF-8に対応してもらえるかどうかは不明ですが、おにたまさんには報告しましたので気長に待ちたいと思います。



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