〜 ナンバー 〜
配列の各要素合計を算出

配列変数の要素毎の数値を合計した結果を返すサンプルモジュールです。
尚、モジュール内部ではループにより各要素にアクセスしているわけですが、
HSP2では配列の要素数を取得するための命令が存在しないため、
コチラで紹介しているPVAL構造体アクセスによるgetdiminfo命令を使用して要素数を確認しています。
	

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

sum 対象配列
対象配列合計を算出する数値型配列変数を指定する。
尚、算出した合計値はstatに返される。
内部でgetdiminfo命令を使用しているため、sum命令の前にgetdiminfo命令を定義すること!

 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
#module
#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 
	return

#deffunc sum val
	mref data, 48
	mref stt, 64
	getdiminfo data
	i = 0
	repeat stat : i += data.cnt : loop
	stt = i
	return
#global

	randomize
	num = 10
	dim v, num
	repeat num
		rnd i, 32768
		v.cnt = i
	loop
	repeat num
		pos  10, cnt * 20 + 10 : mes "要素." + cnt
		pos 100, cnt * 20 + 10 : mes v.cnt
	loop
	sum v
	pos  10, num * 20 + 20 : mes "合計"
	pos 100, num * 20 + 20 : mes stat
	stop

合計値 = sum(対象配列)
合計値算出した合計値の受取先を指定する。
対象配列合計を算出する数値型配列変数を指定する。

 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
#module
#defcfunc sum array data, local i
	if vartype(data) = 3 : i = 0.0
	foreach data : i += data.cnt : loop
	return i
#global

	randomize
	// 整数型
	dim  v32, 10
	foreach v32 : v32.cnt = rnd(32768) : loop
	foreach v32
		pos  10, cnt * 20 + 10 : mes "要素." + cnt
		pos 100, cnt * 20 + 10 : mes v32.cnt
	loop
	pos  10, length(v32) * 20 + 20 : mes "合計"
	pos 100, length(v32) * 20 + 20 : mes sum(v32)
	// 実数型
	ddim v64, 10
	foreach v64 : v64.cnt = double(rnd(32768)) / 777 : loop
	foreach v64
		pos 310, cnt * 20 + 10 : mes "要素." + cnt
		pos 400, cnt * 20 + 10 : mes v64.cnt
	loop
	pos 310, length(v64) * 20 + 20 : mes "合計"
	pos 400, length(v64) * 20 + 20 : mes sum(v64)