〜 ナンバー 〜
配列の各要素平均を算出

配列変数の要素毎の数値を合計してから平均を求めるサンプルモジュールです。
HSP2では小数点以下を扱えないため、整数の範囲でのみ平均を算出しています。
また、HSP3以降であっても小数点以下の扱える桁数には限度があるので誤差が生じます。
HSP2版同様に整数の範囲でのみ算出するには第2引数であるタイプパラメータを指定してください。
尚、モジュール内部ではループにより各要素にアクセスしているわけですが、
HSP2では配列の要素数を取得するための命令が存在しないため、
コチラで紹介しているPVAL構造体アクセスによるgetdiminfo命令を使用して要素数を確認しています。
	

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

average 対象配列
対象配列平均を算出する数値型配列変数を指定する。
尚、算出した平均値はstatに返される。
内部でgetdiminfo命令を使用しているため、average命令の前に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 average val
	mref data, 48
	mref stt, 64
	getdiminfo data
	i = 0
	repeat stat : i += data.cnt : loop
	stt = i / stat
	return
#global

	randomize
	num = 13
	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
	average v
	pos  10, num * 20 + 20 : mes "平気金"
	pos 100, num * 20 + 20 : mes stat
	stop

平均値 = average(対象配列, タイプ)
平均値算出した平均値の受取先を指定する。
対象配列平均を算出する数値型配列変数を指定する。
タイプ算出および受け取る数値の型(0:実数、1:整数)を指定する。

 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
#module
#defcfunc average array data, int type, local i
	if vartype(data) = 3 : i = 0.0
	foreach data : i += data.cnt : loop
	if type : i = int(i) : else : i = double(i)
	return i / length(data)
#global

	randomize
	// 整数型
	dim  v32, 13
	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 average(v32)
	pos  10, length(v32) * 20 + 40 : mes "平均(整数)"
	pos 100, length(v32) * 20 + 40 : mes average(v32, 1)
	// 実数型
	ddim v64, 13
	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 average(v64)
	pos 310, length(v64) * 20 + 40 : mes "平均(整数)"
	pos 400, length(v64) * 20 + 40 : mes average(v64, 1)