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


HSPTV!掲示板


未解決 解決 停止 削除要請

2007
0816
ふにゃふにゃpeekの動作が不安定3解決


ふにゃふにゃ

リンク

2007/8/16(Thu) 19:07:36|NO.10438

はじめまして。
本当はごぶさたしております。ですが、しばらく他言語で浮気をしていたので、
忘れられていると思います。

peek関数を使おうとしたところ、読み出したいデータの場所によって、
エラーが出る現象に会いました。重いデータを処理しようとして、
無理しているワケでもないのですが、
普通に1バイト取り出そうとするだけで、エラーが出る様です。
これは環境依存? 使い方の間違い?
過去ログを見ると、バイナリデータをカ加工する場合、
機械語の話など出て来るようですが、
実はpeekって、あまり使われていない関数で、バグが含まれていたりするのでしょうか?
ちなみの環境はWin2000です。HSP3.0と3.1で試しました。

peekのテストだけのシンプルなスクリプトを作って試すと、
下記の様な事がわかりました。


;対象の変数 sample_data="abcdefg" ;この例はテスト用なので7バイトしか有りませんが、 ;このサイズは大きくても小さくても変わらないようです。 ;存在しないデータを読み取ろうとしたら、問題なく「0」が返されるだけのはず。 b=peek(sample_data,63) ;インデックスに63を指定すると、その場所のデータが返されます。 ;しかしここで64以上の数を指定すると、実際のデータが存在しても、しなくても ;「Error 3 パラメータの値が異常です。」のErrorウインドウが表示されます。 ;64まで大丈夫な場合もあって、再現性はバラバラです。 ;ちなみにlpeekとwpeekの場合は60がOKで61以降がダメだったりします。 mes b stop



この記事に返信する


begriff -いくす-

リンク

2007/8/16(Thu) 19:21:16|NO.10440

普通にsample_dataという変数の確保している初期の領域が64文字分で0〜63がバッファのインデックス指定できる範囲でその範囲をこしてるってことじゃないの?
sdim sample_data,128

とすれば
b=peek(sample_data,64)
だって問題ないのでは?



begriff -いくす-

リンク

2007/8/16(Thu) 19:29:46|NO.10441

>存在しないデータを読み取ろうとしたら、問題なく「0」が返されるだけのはず。
"0"(\0)というデータがあるんです。
debugwindowのメモリダンプをオンにして見てください

バッファサイズ:64
内容:abcdefg
0000 61 62 63 64 65 66 67 00
      〜
0038 00 00 00 00 00 00 00 00

ってなってるでしょ?
つまり(0から数えて)7文字目から63文字目までずーっと0(null)が続いているんです。



ふにゃふにゃ

リンク

2007/8/16(Thu) 23:26:08|NO.10447

ありがとうございました。すごく良い事を教わりました。
sdimやdimでメモリの領域を予約するって、一体どう言うことなのか、
マニュアルを読んでも、ちっとも書いてないので、何だか知らないけど、
作者しかわからん事をやってるんだろうと思っていました。
未定義の値で塞いで置くって言う事だったんですね。

peekで読みに行っただけでは、自動拡張もされないから、
あのエラーメッセージは「このパラメーターの場所にはnullさえも無い」
って、意味ですね。



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