〜 スクリプト 〜
変数の情報取得

変数に入っているデータ以外の、変数サイズや型を取得するにはPVAL構造体にアクセスしてみましょう。
PVAL構造体の説明についてはコチラをご覧ください。
HSP3以降は、HSP2のように命令1つでPVAL構造体を取得できなくなったので、
サンプルではPVAL操作の都度、毎回取得するのは無駄がある様に思えたので、
notesel命令のように予め変数を指定してくような形を取っています。
尚、HSP3以降のサイズ取得関数は変数の使用サイズを取得しています。
数値型であれば、取得できる値が合計サイズを表しているのですが、
文字列型の場合は要素毎に異なるサイズを確保でき、バッファサイズの自動拡張も要素毎に行われるために、
実際の全要素サイズ取得は、別の領域にある要素毎のサイズを取得して合計するしか手はない(と思います)。
そもそも全要素サイズを取得する必要なんてあるものでしょうか、特に文字列型。
	

getvartype 変数
変数指定変数のタイプ「int」型または、「str」型文字列がrefstrにセットされる。

getvarsize 変数
変数指定変数のサイズ(デバッグウィンドウのメモリサイズ)がstatにセットされる。

getdimentions 変数
変数指定変数の次元数がstatにセットされる。

getdiminfo 変数, 次元
変数指定変数、指定次元のサイズがstatにセットされる。
次元1次元目を0として、取得する次元を0〜3のいずれかで指定する。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#module
// 型の取得
#deffunc getvartype val
	mref pval, 1024
	mref ref, 65
	// PVAL構造体のflagで型を判断(2:文字列 4:数値)
	if pval & $FFFF = 2 {
		ref = "str"
	} else {
		ref = "int"
	}
	return

// サイズの取得
#deffunc getvarsize val
	mref pval, 1024
	mref stt, 64
	stt = 4
	repeat 4, 2
		if pval.cnt = 0 : break
		stt = stt * pval.cnt
	loop
	return

// 次元数の取得
#deffunc getdimentions val
	mref pval, 1024
	mref stt, 64
	stt = 0
	// 最大4次元分までループ(指定次元が存在するなら、総数加算)
	repeat 4, 2
		if pval.cnt : stt++
	loop
	if pval & $FFFF = 2 : stt-- // 文字列型なら1つ目は次元数ではないので1つ減らす
	return

// 指定次元のサイズ取得
#deffunc getdiminfo val, int
	mref pval, 1024 : mref dnum, 1
	mref stt, 64
	stt = dnum + 2
	stt = pval.stt
	if (pval & $FFFF = 2) && (dnum = 0) : stt = stt * 4 // 文字列型の1つ目は次元ではなく4の倍数サイズ
	return
#global

	sdim s, 8, 6, 4
	pos 10, 10 : mes "★変数s(8, 6, 4)の情報"
	// 型の取得
	pos 20, 50 : mes "型:"
	getvartype s
	pos 100, 50 : mes refstr
	// 合計サイズ
	pos 20, 80 : mes "サイズ:"
	getvarsize s
	pos 100, 80 : mes stat
	// 総次元
	pos 20, 110 : mes "次元数:"
	getdimentions s
	pos 100, 110 : mes stat
	// 各次元サイズ(4次元までチェック)
	pos 20, 140 : mes "各次元:"
	repeat 4
		getdiminfo s, cnt
		if cnt + 1 < 4 : tmp = "" + stat + "," : else : tmp = stat
		pos cnt * 30 + 100, 140 : mes tmp
	loop
	stop

pvalsel 変数
変数指定変数をPval操作対象に設定する。(notesel命令のような役割)

結果 = getvartype( )
結果指定変数のタイプ「整数」「実数」「文字列」がセットされる。
[パラメータなし]事前にpvalsel命令に対象変数を指定する為、パラメータは必要ない。

結果 = getvarsize( )
結果指定変数の使用メモリがセットされる。
[パラメータなし]事前にpvalsel命令に対象変数を指定する為、パラメータは必要ない。

結果 = getdimentions( )
結果指定変数の次元数がセットされる。
[パラメータなし]事前にpvalsel命令に対象変数を指定する為、パラメータは必要ない。

結果 = getdiminfo(次元)
結果指定次元数のサイズがセットされる。
次元1次元目を0として、取得する次元を0〜3のいずれかで指定する。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#module
// Pval対象変数の決定
#deffunc pvalsel var v, local hspctx, local adr
	mref hspctx, 68
	dupptr adr, hspctx.207, 4
	dupptr pval, adr, 48
	return

// 型の取得
#defcfunc getvartype local type
	type = "extra", "str", "double", "int", "module"
	repeat 4, 2
		// vartype と同じ
		if (pval & 0xFFFF) = cnt {
			type = type(cnt - 1)
		}
	loop
	return type

// サイズの取得
#defcfunc getvarsize
	return pval.6

// 次元数の取得
#defcfunc getdimentions local i
	repeat 4, 2
		// length, length2, length3, length4 と同じ
		if pval.cnt : i++
	loop
	return i

// 指定次元のサイズ取得
#defcfunc getdiminfo int dnum
	return pval(dnum + 2)
#global

	sdim s, 12, 6, 4
	pos 10, 10 : mes "★変数s(12, 6, 4)の情報"
	// 取得変数を指定
	pvalsel s
	// 型の取得
	pos 20, 50 : mes "型:"
	pos 100, 50 : mes  getvartype()
	// 合計サイズ
	pos 20, 80 : mes "サイズ:"
	pos 100, 80 : mes getvarsize()
	// 総次元
	pos 20, 110 : mes "次元数:"
	pos 100, 110 : mes getdimentions()
	// 各次元サイズ(4次元までチェック)
	pos 20, 140 : mes "各次元:"
	repeat 4
		tmp = str(getdiminfo(cnt))
		if cnt + 1 < 4 : tmp += ","
		pos cnt * 30 + 100, 140 : mes tmp
	loop