【HSP】変数の (全体の) バッファサイズ取得 (配列変数も可) 【モジュール】

【HSP】変数の (全体の) バッファサイズ取得 (配列変数も可) 【モジュール】

(HSP用の) プラグインを作ったりしていると、HSPの変数サイズが知りたくなることがあります。(プラグイン以外でも使えます)
ところが、sizeofだとひとつのデータの大きさだし、_msizeでやってもHSPが管理している変数の大きさはちゃんと取得できないし…。
というわけで、HSP内で変数の大きさを取得するモジュールを作りました。
文字列型、実数型、整数型に対応しています。
※2015/04/23 インデントとかコメントとか修正。中身は変わっていません

#define __HSP_VARSIZE__
#ifndef __HSP_VARSIZE__

#module M_VARSIZE

// 
// varsize 関数
// 
// 変数の大きさを取得
// 変数型が対応していないものか、不明なものなら -1 が返る
// 
#defcfunc varsize var _p1
dim size   // 大きさを格納する
dim len, 4 // 調整後の length*() を格納する

// 変数型ごとに要素サイズ取得
switch vartype(_p1)
case 2 // 文字列型
dupptr size, varptr(_p1) - 16, 4
swbreak
case 3 // 実数型
size = 8
swbreak
case 4 // 整数型
size = 4
swbreak
default // 未対応もしくは不明
return -1
swend

// length*() の値を修正
len = length(_p1), length2(_p1), length3(_p1), length4(_p1)
repeat 4
if (len(cnt) = 0) : len(cnt)++
loop

// 要素サイズ * 要素数
size *= len(0) * len(1) * len(2) * len(3)

return size

#global

#endif

使い方

val=varsize(p1)
p1=変数 : サイズを知りたい変数
サイズ取得成功時には (全体の) サイズが、失敗時には-1が返ります。

1次元配列ある時点で2次元配列1まであるとも考えられると思うのですけど…なんかそれHSP内では別々にとらえているらしく、1次元配列の数以外は取得すると、ないときには0が返ってくるので、仕方がなく、0の時は1に置き換えるようくみました。
これ使ってpeek,poke等の関数を拡張する (拡張した関数を用意している) プラグインを作成中です~。
ありえない場所に書き込もうとしたり取得しようとしたりすると固まって落ちるので…。
エラー処理別にするために↑のどうなモジュール作りました。
ではいつかまたお会いしましょう~。
↓クリック (投票) お願いします~


「【HSP】変数の (全体の) バッファサイズ取得 (配列変数も可) 【モジュール】」への2件のフィードバック

  1. これは確かに、変数の型とか意識しながらデータを扱うときなど便利そうですね^^!
    保存するときに容量を確かめたりとか、何か色々できそうです。

  2. ありがとうございます!
    デバッグウィンドウでサイズ確認ができるくらいだから本当はもっとスマートな取得方法があるかもしれないのですけどね…。

コメントは受け付けていません。