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


HSPTV!掲示板


未解決 解決 停止 削除要請

2009
0610
uduki4byte以上のサイズの変数の確保について6解決


uduki

リンク

2009/6/10(Wed) 16:43:05|NO.25604

先月こちらで一つ質問に答えて頂いた者です。
お世話になっております。

ゲームのセーブ用データを作りたいと思っていたのですが
変数の確保でつまづいておりまして、助言お願い致します。
(HSP3.1使用)

もっとも単純化したモデルで、データ用に変数dataを作り、
フラグをビット演算で立てていくことを想定しているのですが、
sdimで8byteとったつもりで代入しても4byte分しか
読み書きが出来ませんでした。
// 実際にやろうとしていたのはdata確保->peek、pokeによる読み書き


sdim data,8 sdata=$ffffffffffffffff mes strf("%016x",sdata) 表示結果:00000000ffffffff

このような動作を期待する場合
どのような手順を踏むのが普通なのでしょうか?


以上、宜しくお願い致します。



この記事に返信する


SYAM

リンク

2009/6/10(Wed) 18:33:42|NO.25606

示してあるスクリプトでは、

- dataを使ってない
- sdataに代入している整数値が大きすぎる(整数は0xffffffffまで)

…のような問題があるので、当然失敗するでしょう。
ですから、実際にやろうとしたことができなかった理由を推測できません。
実際にやろうとしたのと同じ方法でスクリプトを示してみてください。



uduki

リンク

2009/6/10(Wed) 19:09:17|NO.25609

返信ありがとうございます。

失礼しました。
sdata->dataです。書き直します。


sdim data,8 data=$ffffffffffffffff mes strf("%016x",sdata) 表示結果:00000000ffffffff

実際にやろうとしていたのは、


sdim data,16 sdim data2,1 data=$00000000000000000000000000000000 data2=peek(data2,4) //エラー(パラメータの値が異常です) ...(data2のデータ書き換え) poke data,4,data2

のような感じで、dataが本体で
部分的にpeekで1byte取ってきて書き換えて
pokeで上書きするような流れをしたかったのですが。

今回の場合はごく単純に
dataに1回で4byte以上のデータを代入するのが
無理ということなのでしょうか?

皆様にとって当たり前のところが
わかっていない気がしております。申し訳ありません。
もう少し試してみます。



uduki

リンク

2009/6/10(Wed) 19:41:45|NO.25611

NO.25609の
> 今回の場合はごく単純に
> dataに1回で4byte以上のデータを代入するのが
> 無理ということなのでしょうか?

が一番わかっていなかった部分のようでした。
変数をlpokeで埋めたところ、特に問題なく解決致しました。


sdim data,16 sdim data2,1 lpoke data,0,$00000000 lpoke data,4,$00000000 lpoke data,8,$00000000 lpoke data,12,$00000000 data2=peek(data2,4) ...(data2のデータ書き換え) poke data,4,data2

バイナリデータの扱いについて
私が感覚的にわかっていない部分がまだありそうです。

ひとまずこちらは解決とさせて頂きます。
ありがとうございました。



uduki

リンク

2009/6/10(Wed) 19:43:41|NO.25612

解決チェックを入れるのを忘れました。



Kpan

リンク

2009/6/10(Wed) 21:01:04|NO.25614

> sdim data,16
これは文字列型変数の確保です。16バイトと指定してますが、実際には最小値の
64バイトが確保されたことになります。

整数値型変数は↓みたいな感じ。

dim data, 4 ; あるいは data = $00000000, $00000000, $00000000, $00000000

エディタの[HSP]→[Debugウィンドウ]を有効にして、変数タブでメモリダンプ
を確認あれ〜



uduki

リンク

2009/6/11(Thu) 09:15:03|NO.25617

>Kpanさん

レスありがとうございます。
// サイトにもお世話になっております。。

もともとsdimで領域を確保していたのは
バイナリデータを扱うのにどういう方法があるのかググって見たら
バッファの確保にsdimを使っていたから、という単純な理由でした。

メモリダンプの見方が今まで良くわかっていなかったので
手付かずだったのですが、今回の件のついでにいろいろと試してみたら、
メモリ周りの疑問に思っていたことがたくさん解消しました。。
sdimの宣言は64byte以下だと特に指定する意味は無いということですね。


もう少し精進したいと思います。
今後とも宜しくお願い致します。



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