〜 スクリプト 〜
二次元配列を一次元配列のメモリノートパッド形式に変換

メモリノートパッドとは、改行を区切りコードとした1行毎のテキストデータのことで、
予めnotesel命令で対象バッファ(=変数)を指定しておき、行取得・挿入・削除を簡単に行うことが出来ます。
メモリノートパッド形式に変換するのは上記で述べた通り、
HSP2・HSP3問わずに標準命令だけで操作しやすいことがその理由として挙げられます。
例えば、配列変数で保持しているデータをオブジェクトに入れて表示させたい時に、
ローカル(グローバル)にゴリゴリ書くと、変換している処理が目障りです。
サンプルモジュールのような命令を一発実行させるだけで、
下記サンプルのように、肝心のオブジェクト配置プログラム部分がスッキリ見やすくまとまります。
特に、開発中ではなくしばらく経ってから見たときに、ゴチャゴチャしていると、
自分で書いたプログラムさえも解析に時間を掛けてしまいかねません。
ロジック毎に処理を分け、汎用的な部分はモジュールにしてしまいましょう。
HSP2は標準命令に配列要素数取得命令がないので、内部でコチラgetdiminfo命令を使用しています。
サンプルのように、getdiminfo命令を先に定義しなければ使用できませんのでご注意。
	

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

arraytoanote 設定先配列変数, 取得元配列変数
設定先配列変数一次元配列のメモリノートパッド形式にしてセットする。
内部でgetdiminfo命令を使用している為、
arraytoanote命令の前にgetdiminfo命令を定義すること!
取得元配列変数一次元配列のメモリノートパッド形式に変換したい文字列型の2次元配列変数を指定する。

 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
#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 arraytoanote val, val
	mref sv, 56 : mref gv, 57
	getdiminfo sv, 0 : size.0 = stat // 設定先変数のバッファサイズ
	getdiminfo sv, 1 : size.1 = stat // 設定元配列の要素数
	getdiminfo gv, 0 : size.2 = stat // 取得元配列1次元目のバッファサイズ
	getdiminfo gv, 1 : size.3 = stat // 取得元配列1次元目の要素数
	getdiminfo gv, 2 : size.4 = stat // 取得元配列2次元目の要素数
	sdim tmpdat, size.0 + 1
	kugiri = "\n"
	strlen len, kugiri
	repeat size.4
		i = cnt
		sv.i = ""
		repeat size.3
			strlen len.1, sv.i
			if cnt ! 0 & (len.0 + len.1 + 1 < size.0) : sv.i += kugiri
			strlen len.1, gv.cnt.i
			strlen len.2, sv.i
			if len.1 + len.2 + 1 < size.0 {
			  sv.i += gv.cnt.i
			} else {
			  strmid tmpdat, gv.cnt.i, , size.0 - len.2 - 1
			  sv.i += tmpdat
			  break
			}
		loop
	loop
	return
#global

	genrenum = 4
	sdim genre, 12, genrenum
	sdim ary, 10, 5, genrenum
	sdim note, 40, genrenum
	dim index, genrenum
	genre = "記録媒体", "五大湖", "三名園", "四神"
	ary.0.0 = "FDD", "CD−R", "DVD−R", "BD−R"
	ary.0.1 = "Superior", "Erie", "Huron", "Michigan", "Ontario"
	ary.0.2 = "偕楽園", "兼六園", "後楽園"
	ary.0.3 = "玄武", "青龍", "白虎", "朱雀"
	arraytoanote note, ary // 配列データをCSV変数に格納
	objsize 100, 20
	repeat genrenum
		pos  10, cnt * 30 + 10 : mes genre.cnt
		pos 100, cnt * 30 + 10 : combox index.cnt, 100, note.cnt
	loop
	stop

arraytoanote 設定先配列変数, 取得元配列変数
設定先配列変数一次元配列のメモリノートパッド形式にしてセットする。
取得元配列変数一次元配列のメモリノートパッド形式に変換したい文字列型の2次元配列変数を指定する。

 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
#module
#deffunc arraytoanote array sv, array gv, local i
	repeat length2(gv)
		i = cnt
		sv.i = ""
		repeat length(gv)
			if cnt : sv.i += "\n"
			sv.i += gv.cnt.i
		loop
	loop
	return
#global

	sdim genre, 12, 4
	sdim ary, 10, 5, length(genre)
	sdim note, 40, length(genre)
	dim index, length(genre)
	genre = "貴金属", "海洋", "大腿筋", "脊椎動物"
	ary.0.0 = "金", "銀", "銅", "白金"
	ary.0.1 = "太平洋", "大西洋", "インド洋"
	ary.0.2 = "伸筋", "屈金", "転筋"
	ary.0.3 = "無顎類", "魚類", "両生類", "爬虫類", "哺乳類"
	arraytoanote note, ary // 配列データをCSV変数に格納
	objsize 100, 20
	foreach genre
		pos  10, cnt * 30 + 10 : mes genre.cnt
		pos 100, cnt * 30 + 10 : combox index.cnt, 100, note.cnt
	loop