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


HSPTV!掲示板


未解決 解決 停止 削除要請

2012
0215
(´ω`)cnvstowについての素朴な疑問5解決


(´ω`)

リンク

2012/2/15(Wed) 08:41:24|NO.44877

以下のソースをちと試していただきたいのですが、


txt = "藍上尾" mes txt cnvstow a, txt mes a b = cnvwtos(a) mes b

4行目の「mes a」をそのままにするのとコメントアウトするのとでは、
最後の「mes b」の結果が変わります。

で、文字列として表示する際にバッファ内のUnicodeが変換されてしまうのかと思い、
試みに↓のように変更しましたが、


txt = "藍上尾" mes txt cnvstow a, txt x = a mes x b = cnvwtos(a) mes b

やっぱり変になってしまう。

これは、どういう理由なのでしょうか?
ご存知の方、いらっしゃいませんでしょうか?( ゚ω゚ )



この記事に返信する


いかろ

リンク

2012/2/15(Wed) 09:55:39|NO.44878

どうやら変に表示されるのはaがint型であるのが問題のようです。
明示的にaを初期化してないとcnvstowで代入するときにstr型にならずにint型で初期化されてしまうみたいですね。
「藍上尾」はunicodeで6byte,int型は4byteなのでオーバーフローが発生して変に表示されているような気がします。
ただ、代入の時点ではなくmesを入れるか入れないかで変わってしまうのかは謎ですね...



(´ω`)

リンク

2012/2/15(Wed) 10:44:03|NO.44879

ご教示、まとこに感謝いたします。
変数の型の問題だったわけですね、なるほど……(´ω`)

……と思って、型の違いでどうおかしくなってたかを調べようと思い、
デバッガで変数のダンプを観察していたらさらに不思議なことに気がつきました。


txt = "藍上尾" ; 6bytes(97 95 8F E3 94 F6) unicodeでは、CD 85 0A 4E 3E 5C mes txt cnvstow a, txt ; aがint型なので先頭4bytes(CD 85 0A 4E)までしか入れられない mes a ; "1309312461"(=0x85cd4e0a) b = cnvwtos(a) ; 再びコンバートして…… mes b ; え、"藍上"でも"1309312461"でもなくて"藍上312461"?(u゚ω゚ )

cnvwtos命令での変換が、なんか不思議なのです。
int型からなので4bytesだけ変換されたものでもなく、数字がstr型に変換されたものでもなく、
なぜか双方が合成されたような結果が。

教えていただいた通り、実用面ではcnvstow命令に使う変数を文字列型で宣言することにしたので、
この問題には遭遇しないと思うのですが、頭の体操っぽくなってきたので再び質問を。

cnvwtosでのこの変換、どういう理屈なんでしょう?( ゚ω゚ )



暇人

リンク

2012/2/15(Wed) 20:40:53|NO.44889

動作から見た推測だが・・・

作業用(?)に特定のバッファが使いまわしされれて
>mes a
ここで作業buf=str(a)になって
>b = cnvwtos(a)
ここで作業bufの先頭4バイトが書き換わって
bに出力される
aがint型だから終端文字列が処理されない

txt = "藍上尾あいうえおあきくえこ" mes txt ; 実はここで既に作業bufには"藍上尾"が入ってる cnvstow a, txt mes "____"+a ; 作業bufに"____1309312461"が書き込まれ(aは文字列変換されるからここでは終端処理されてる) b = cnvwtos(a) ; "____1309312461"ここに終端文字処理されずに上書きされて mes b ; "藍上1309312461"に



(´ω`)

リンク

2012/2/16(Thu) 10:57:55|NO.44898

いかろさんの言われていたオーバーフローが、作業バッファ(?)で発生してたと。
暇人さんのソースでも、事前に変数を文字列型で初期化しておけば問題おきませんね。

なるほど……勉強させていただきました。
解決にしておきます。(´ω`)



shiva

リンク

2012/2/16(Thu) 15:51:42|NO.44900

根本的には、cnvstowにバッファーオーバーランのバグがあるのが原因だと思います。

このバグはすでに報告もされています(HSPバグトラック245)が、まだ修正されていないようですね。



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