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


HSPTV!掲示板


未解決 解決 停止 削除要請

2018
1021
たまごlpokeについてバグなのか仕様なのかやってはいけないことなのか4解決


たまご

リンク

2018/10/21(Sun) 18:03:40|NO.85635

こんばんは
lpokeですこし戸惑っているのですが


data="" lpoke data,0,$46464952 lpoke data,4,$000d7574 lpoke data,8,$45564157 lpoke data,12,$20746d66 lpoke data,16,$00000010 data+="ABCD"

みたいにやるとABCDのデータが途中の00があるところから上書きしてしまうのです

実際の挙動
52 49 46 46 74 75 0D 41 42 43 44 00 66 6D 74 20
10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
こちらの望んでいた挙動
52 49 46 46 74 75 0D 00 57 41 56 45 66 6D 74 20
10 00 41 42 43 44 00 00 00 00 00 00 00 00 00 00

バグなのでしょうか?仕様なのでしょうか?やってはいけないことなのでしょうか?



この記事に返信する


f(残業中)

リンク

2018/10/21(Sun) 18:23:17|NO.85636

>こちらの望んでいた挙動
>52 49 46 46 74 75 0D 00 57 41 56 45 66 6D 74 20
>10 00 41 42 43 44 00 00 00 00 00 00 00 00 00 00



>52 49 46 46 74 75 0D 【00】 57 41 56 45 66 6D 74 20

この0を文字列終端とみなされて

そこから

data+="ABCD"されて

>52 49 46 46 74 75 0D 【41:A】 【42:B】 【43:C】 【44:D】 【00:文字列終端】 66 6D 74 20


になっただけじゃね?



あらや

リンク

2018/10/21(Sun) 18:34:09|NO.85637

どちらかというと仕様ですね。

HSPでは文字列の終端コードを『0』として扱うのはご存知かと思います。
そして文字列処理系の命令や関数もそれに合わせた構造で作られている物がほとんどです。

strlenやstrmidなどもコード『0』を見つけた時点で文字列の終わりとして
それ以降にどんな数値が入っていても無視します。

>data+="ABCD"
この行も内部的に『0』の位置から上書きして
その後に『0』を付けるという構造になっているのでしょう。

そういうわけでlpokeだけでなく、
仮にwpokeやpokeを使っても同じ事になるかと思われます。



さか

リンク

2018/10/21(Sun) 18:42:24|NO.85638

やるなら以下ですかね。
メモリ確保外だとメモリ破壊になるので気を付けてください。

data="" mes "dataのメモリ上のサイズ:"+varsize(data) data=strf( "%20cABCD",' ' ) lpoke data,0,$46464952 lpoke data,4,$000d7574 lpoke data,8,$45564157 lpoke data,12,$20746d66 lpoke data,16,$00000010 repeat varsize(data)/4 mes strf("%08x", lpeek(data,i) ) i+=4 loop



たまご

リンク

2018/10/21(Sun) 21:24:55|NO.85644

ありがとうございました

参考になりました



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