-
Notifications
You must be signed in to change notification settings - Fork 0
/
02_myarray_core.hsp
294 lines (220 loc) · 8.02 KB
/
02_myarray_core.hsp
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
; INFO *************************************************************************
; FileName : myarray_core.hsp
; Version : 0.28.3
; Date : 2023/04/01
; Author : YUZRANIUM(ゆずらにうむ)
; Twitter : https://twitter.com/YUZRANIUM
; GitHub : https://github.com/YUZRANIUM/02_myarray
;*******************************************************************************
/* Description
このモジュールはHSPTV!掲示板の皆様によって支えられております。
この場を借りて感謝申し上げます。誠に有難うございます。
*** 掲示板情報 ***
kind : 宣伝
date : 2023/01/16
person : Yuzranium
content : 多次元配列をなんやかんやする
このモジュールはほぼすべての命令・関数の中核を担うイテレータなどを
内部命令化・関数化した本プロジェクト最重要モジュールとなっています。
他モジュールの多くの命令・関数内で、...@myarray_core として利用しています。
また、coreと言うだけあって手を加える予定はかなり少ないです。
* 各モジュールの優先順位
1. _core
2. _list
3. _srch
4. myarray(無印)
********************************************************************************/
#ifndef __myarray_core__
#define global __myarray_core__
; このモジュールは、myarrayモジュール内で
; 配列処理の中核を担う関数・命令を集めたものです
;
#module "myarray_core"
; myarray_coreモジュールの内部変数の初期化
; このファイルの最下部で呼び出しておりますので、特別呼び出す必要はありません。
;
#deffunc local _myarray_core_init_
dim prm_chk_, 5 ; dimlinec 関数 パラメータ監視・分岐用
; 配列情報
; ------------------------------------------------------
; ary_inf(0) : length() (1次元要素数) (旧 : all_dim)
; ary_inf(1) : length2() (2次元要素数)
; ary_inf(2) : length3() (3次元要素数)
; ary_inf(3) : length4() (4次元要素数)
;
; ary_inf(4) : 使用次元数 (1, 2, 3, 4) (旧 : use_dim)
; ary_inf(5) : 配列の長さ (旧 : sum_dim)
; ary_inf(6) : 配列の変数型
;
; ------------------------------------------------------
ary_inf = 0 : dim ary_inf, 7
; if-else での型分岐用
;-------------------------------------------------------
; vtype(0) : ラベル型 | モジュール型
; vtype(1) : ラベル型
; vtype(2) : 文字列型
; vtype(3) : 実数型
; vtype(4) : 整数型
; vtype(5) : モジュール型
; vtype(6) : COMオブジェクト型
;
vtype = 0 : dim vtype, 7
; 一次保存用
my_temp = 0
return
;-------------------------------------------------------------------------------
; モジュール内で多次元配列を扱うための準備
;-------------------------------------------------------
; ary_inf(0) : length() (1次元要素数) (旧 : all_dim)
; ary_inf(1) : length2() (2次元要素数)
; ary_inf(2) : length3() (3次元要素数)
; ary_inf(3) : length4() (4次元要素数)
;
; ary_inf(4) : 使用次元数 (1, 2, 3, 4) (旧 : use_dim)
; ary_inf(5) : 配列の長さ (旧 : sum_dim)
; ary_inf(6) : 配列の変数型
;
#deffunc dim_info array ary, array ary_inf_
dim ary_inf_, 7
; 配列の各次元要素数
ary_inf_(0) = length(ary), length2(ary), length3(ary), length4(ary)
; 使用次元の確認
ary_inf_(4) = (ary_inf_(0) ! 0) + (ary_inf_(1) ! 0) + (ary_inf_(2) ! 0) + (ary_inf_(3) ! 0)
; 配列合計数
ary_inf_(5) = 1
repeat ary_inf_(4): ary_inf_(5) *= ary_inf_(cnt) :loop
; 変数型
ary_inf_(6) = vartype(ary)
return
;-------------------------------------------------------------------------------
; モジュール内で多次元配列を扱うための準備
;-------------------------------------------------------
; ( d = 0:本体情報 / 1,2,3,4:各次元要素(key) の情報 )
;
; asoc_inf(0, d) : length() (1次元要素数)
; asoc_inf(1, d) : length2() (2次元要素数)
; asoc_inf(2, d) : length3() (3次元要素数)
; asoc_inf(3, d) : length4() (4次元要素数)
;
; asoc_inf(4, d) : 使用次元数 (1, 2, 3, 4)
; asoc_inf(5, d) : 配列の長さ
; asoc_inf(6, d) : 配列の変数型
;
; asoc_inf(7, d) : 配列の現在位置
;
#deffunc local asoc_info_ array ary, array asoc_inf_, int d1
; 配列の各次元要素数
asoc_inf_(0, d1) = length(ary), length2(ary), length3(ary), length4(ary)
; 使用次元の確認
asoc_inf_(4, d1) = (asoc_inf_(0, d1) ! 0) + (asoc_inf_(1, d1) ! 0) + (asoc_inf_(2, d1) ! 0) + (asoc_inf_(3, d1) ! 0)
; 配列の長さ
asoc_inf_(5, d1) = 1
repeat asoc_inf_(4, d1): asoc_inf_(5, d1) *= asoc_inf_(cnt, d1) :loop
; 変数型
asoc_inf_(6, d1) = vartype(ary)
return
;===========================================================
; if-else での型分岐用
;-------------------------------------------------------
; vtype(0) : ラベル型 | モジュール型
; vtype(1) : ラベル型
; vtype(2) : 文字列型
; vtype(3) : 実数型
; vtype(4) : 整数型
; vtype(5) : モジュール型
; vtype(6) : COMオブジェクト型
;
#deffunc local typ_info_ array ary, array vtype_
; 変数の型による分岐
vtype_(0) = (vartype(ary) = 1) | (vartype(ary) = 5)
repeat 6, 1: vtype_(cnt) = (vartype(ary) = cnt) :loop
return
;###########################################################
; 配列の各次元要素からオフセット値 (1次元化要素数) へ
;
#defcfunc local dim_num_linec_ array ary_inf_, int d1, int d2, int d3, int d4
return (d1 + (ary_inf_.0 * d2) + (ary_inf_.0 * ary_inf_.1 * d3) + (ary_inf_.0 * ary_inf_.1 * ary_inf_.2 * d4))
; ----------------------------------------------------------
; 配列のオフセット値 (1次元化要素数) から各次元要素へ
;
#deffunc local dim_line_num_ array ary_inf_, array dim_num, int dim_ofset
repeat ary_inf_(4)
my_temp = dim_ofset
repeat cnt
my_temp /= ary_inf_(cnt)
loop
dim_num(cnt) = my_temp \ ary_inf_(cnt)
loop
return
;###########################################################
; 配列のオフセット値 (1次元化要素数) から各次元要素を返す
;
; ary : 多次元配列変数
; dim_num : 次元要素数を受け取る変数
; dim_ofset : aryのオフセット値 (1次元化要素数)
;
#deffunc linedim array ary, array dim_num, int dim_ofset
; 配列情報の取得
dim ary_inf : dim_info ary, ary_inf
if ary_inf(5) < dim_ofset : return 0
dim dim_num, 4 : dim_line_num_@myarray_core ary_inf, dim_num, dim_ofset
return
; ----------------------------------------------------------
; 配列の各次元要素から配列のオフセット値 (1次元化要素数) を返す
;
; ary : 多次元配列変数
; d1,d2,d3,d4 : 各次元要素数
;
#defcfunc dimlinec array ary, int d1, int d2, int d3, int d4
; 配列情報の取得
dim ary_inf, 7 : dim_info ary, ary_inf
; 条件分岐用
dim prm_chk_, 5 : prm_chk_ = d1, d2, d3, d4
; 各次元要素数より指定値が大きい または 0より小さい
repeat 4
if (prm_chk_.cnt = 0) {continue}
else:if (prm_chk_.cnt < 0) | (ary_inf.cnt <= prm_chk_.cnt) {prm_chk_.4 = 1}
loop
if prm_chk_(4) == 1 : return 0
;___________________________________
dim prm_chk_, 5
prm_chk_(0) = (d1 = 0) & (d2 = 0) & (d3 = 0) & (d4 = 0)
prm_chk_(1) = (d1 <= ary_inf.0) & (d2 <= ary_inf.1) & (d3 <= ary_inf.2) & (d4 <= ary_inf.3)
; prm_chk_(0) 配列の "長さ" を返す
; prm_chk_(1) 配列の "オフセット値" を返す
if prm_chk_(0) {return ary_inf(5)}
else:if prm_chk_(1) {return dim_num_linec_@myarray_core(ary_inf, d1, d2, d3, d4)}
else {return 0}
;-----------------------------------------------------------
; 型変換
; val = TypeCnv(p1, s1)
;
; [ int ] p1 : 型のタイプ値 (2:文字列型 / 3:実数型 / 4:整数型)
; [ str ] s1 : 変換する値
;
#defcfunc TypeCnv str s1, int p1
if (p1 = 2) {return str(s1)}
else:if (p1 = 3) {return double(s1)}
else:if (p1 = 4) {return int(s1)}
;-----------------------------------------------------------
;
; STRUCTDAT構造体 情報表示関数
;
#defcfunc local STRUCTDAT_info_ var format_, array ary, int d1
return strf(format_, ary(0, d1), ary(1, d1), ary(2, d1), ary(3, d1), ary(4, d1), ary(5, d1), ary(6, d1))
;-----------------------------------------------------------
;
; PVAL構造体 情報表示関数
;
#defcfunc local PVAL_info_ var format_, array ary
return strf(format_, (ary(0) & $FF), (ary(0) >> 16), ary(1), ary(2), ary(3), ary(4), ary(5), ary(6), ary(7), ary(7))
;-----------------------------------------------------------
;
; STRUCTDAT構造体 情報表示関数
;
#defcfunc local STRBUF_info_ var format_, array ary
return strf(format_, (ary(0) & $FF), (ary(0) >> 16), ary(1), ary(2), ary(3), ary(3), ary(4), ary(4), ary(5), ary(5))
#global // myarray_core
; myarray_core モジュール内部で使用する変数の初期化です。
_myarray_core_init_@myarray_core
#endif //__myarray_core__