-
Notifications
You must be signed in to change notification settings - Fork 0
/
02_myarray_list.hsp
382 lines (287 loc) · 11.2 KB
/
02_myarray_list.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
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
; INFO *************************************************************************
; FileName : 02_myarray_list.hsp
; Version : 0.28.3
; Date : 2023/04/01
; Author : YUZRANIUM(ゆずらにうむ)
; Twitter : https://twitter.com/YUZRANIUM
; GitHub : https://github.com/YUZRANIUM/02_myarray
;*******************************************************************************
/* Description
このモジュールは主に多次元配列を1次元配列として扱うものや、
配列をリストのように扱うといったデータ管理用途の機能を集めたものです。
未だ開発途中で実験的なのもでもあり、今後の開発やアップデートの中心になリます。
*** スコープ情報 ***
- 輸入品 -
myarray_core から
* dim_info (uniary)
* dim_line_num_ (uniary, uniary_)
myarray_srch から
* MDALiSrch_ (union_)
* MDALiSrch_ (union4_)
- 輸出品 -
myarray_srch へ
* uniary_ (MDALiSrch_, MDABiSrch_)
********************************************************************************/
#ifndef __myarray_list__
#define global __myarray_list__
#module "myarray_list"
; myarray_coreモジュールの内部変数の初期化
; このファイルの最下部で呼び出しておりますので、特別呼び出す必要はありません。
;
#deffunc local _myarray_list_init_
; ラベルジャンプの分岐用
ldim jump, 5, 2
; uniary
jump(0, 0) = *not_varuni@myarray_list, *uniarycf_1@myarray_list, *uniarycf_2@myarray_list, *uniarycf_3@myarray_list, *uniarycf_4@myarray_list
jump(0, 1) = *not_uniary@myarray_list, *uniarray_1@myarray_list, *uniarray_2@myarray_list, *uniarray_3@myarray_list, *uniarray_4@myarray_list
; strf関数用書式文字列
sfrmt = "" : sdim sfrmt, 128, 3
sfrmt(0) = "%s : %s : %s\n"
sfrmt(1) = "%s : %s : %s : %s\n"
sfrmt(2) = "//// < %s > IS NOT FOUND! ////\n\n"
; union_d, union関数の書式のユーザー設定用
sdim uni_format
dim i, 7
dim j, 7
; 連想配列情報 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) : 配列の現在位置
;-------------------------------------------------------
; asoc_info = 0 : dim asoc_info, 8, 5
return
;-------------------------------------------------------------------------------
;
; 多次元配列を1次元配列として扱う (業務用)
;
; val = uniary_(ary1, dim_ofset, ary_inf_)
;
; [ int ] ary1 : 変数名
; [array] dim_ofset : 配列のオフセット値 (1次元化要素数)
; [array] ary_inf_ : 配列情報変数名
;
#defcfunc uniary_ array ary1, int dim_ofset, array ary_inf_
; 配列のオフセット値(1次元化要素数)から本来の各次元要素数を復元
dim i, 7 : dim_line_num_@myarray_core ary_inf_, i, dim_ofset
gosub jump(ary_inf_(4), 0) ; ラベルジャンプで分岐
return
//============================================================================//
; 多次元配列を1次元配列として扱う (ユーザー用)
;
; val = uniary(ary1, dim_ofset)
;
; [ int ] ary1 : 変数名
; [array] dim_ofset : 配列のオフセット値 (1次元化要素数)
;
#defcfunc uniary array ary1, int dim_ofset
; 配列情報の取得
dim ary_inf, 7 : dim_info ary1, ary_inf
; 配列のオフセット値(1次元化要素数)から本来の各次元要素数を復元
dim i, 7 : dim_line_num_@myarray_core ary_inf, i, dim_ofset
; ラベルジャンプで分岐
gosub jump(ary_inf(4), 0)
return
//------------------------------- 配列書き出し -------------------------------//
*not_varuni@myarray_list
return
; junp(1, 0)
*uniarycf_1@myarray_list
return ary1(i(0))
; junp(2, 0)
*uniarycf_2@myarray_list
return ary1(i(0), i(1))
; junp(3, 0)
*uniarycf_3@myarray_list
return ary1(i(0), i(1), i(2))
; junp(4, 0)
*uniarycf_4@myarray_list
return ary1(i(0), i(1), i(2), i(3))
;-------------------------------------------------------------------------------
; 多次元配列を1次元配列として扱う (代入 / 業務用)
; asin_uniary ary1, dim_ofset, in_val, ary_inf
;
; [ int ] ary1 : 変数名
; [array] dim_ofset : 配列のオフセット値 (1次元化要素数)
; [ var ] in_val : 代入値
; [array] ary_inf : 配列情報
;
#deffunc local asin_uniary array ary1, int dim_ofset, str in_val, array ary_inf_
; 配列のオフセット値(1次元化要素数)から本来の各次元要素数を復元
dim i, 7 : dim_line_num_@myarray_core ary_inf_, i, dim_ofset
; ラベルジャンプで分岐
gosub jump(ary_inf_(4), 1)
return
//------------------------------- 配列書き出し -------------------------------//
*not_uniary@myarray_list
return
; junp(1, 1)
*uniarray_1@myarray_list
ary1(i(0)) = TypeCnv(in_val, vartype(ary1))
return
; junp(2, 1)
*uniarray_2@myarray_list
ary1(i(0), i(1)) = TypeCnv(in_val, vartype(ary1))
return
; junp(3, 1)
*uniarray_3@myarray_list
ary1(i(0), i(1), i(2)) = TypeCnv(in_val, vartype(ary1))
return
; junp(4, 1)
*uniarray_4@myarray_list
ary1(i(0), i(1), i(2), i(3)) = TypeCnv(in_val, vartype(ary1))
return
;-------------------------------------------------------------------------------
; 多次元配列を1次元配列として扱う (代入 / 業務用)
; Auniary ary1, dim_ofset, in_val, ary_inf
;
; [array] ary1 : 変数名
; [ int ] dim_ofset : 配列のオフセット値 (1次元化要素数)
; [ var ] in_val : 代入値
; [array] ary_inf : 配列情報
#define global Auniary(%1,%2,%3,%4) asin_uniary@myarray_list%1,%2,str(%3),%4
;-------------------------------------------------------------------------------
;
; フォーマット定義命令
;
; uniformat s_format
;
; [ str ] s_format : 書式文字列
;
#deffunc uniformat str s_format
sdim uni_format
uni_format = s_format
return
;-------------------------------------------------------------------------------
;
; 複数の多次元配列を1次元配列として扱う (オフセット (1次元化要素数) 指定)
;
; val = union_d(ary1, ary2, ary3, dim_ofset)
;
; [array] ary1 : メインで管理する配列変数名
; [array] ary2 : サブで管理する配列変数名 (通常変数可)
; [array] ary3 : サブで管理する配列変数名 (通常変数可)
; [ int ] dim_ofset : 配列のオフセット値 (1次元化要素数)
;
#defcfunc union_d array ary1, array ary2, array ary3, int dim_ofset
; uni_formatが設定されていなければこちらで設定する
if (uni_format = "") {uni_format = sfrmt(0)}
return strf(uni_format, uniary(ary1, dim_ofset), uniary(ary2, dim_ofset), uniary(ary3, dim_ofset))
;-------------------------------------------------------------------------------
;
; 4つの多次元配列を1次元配列として扱う (オフセット (1次元化要素数) 指定)
;
; val = union4d(ary1, ary2, ary3, ary4, dim_ofset)
;
; [array] ary1 : メイン管理する配列変数名
; [array] ary2,ary3,ary4 : サブで管理する配列変数名 (通常変数可)
; [ int ] dim_ofset : 配列のオフセット値 (1次元化要素数)
;
#defcfunc union4d array ary1, array ary2, array ary3, array ary4, int dim_ofset
; uni_formatが設定されていなければこちらで設定する
if (uni_format = "") {uni_format = sfrmt(1)}
return strf(uni_format, uniary(ary1, dim_ofset), uniary(ary2, dim_ofset), uniary(ary3, dim_ofset), uniary(ary4, dim_ofset))
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
;
; 複数の多次元配列を1次元配列として扱う (ary1の値で直接指定)
;
; val = union(ary1, ary2, ary3, ary1_val)
;
; [array] ary1 : メインで管理する配列変数名
; [array] ary2 : サブで管理する配列変数名 (通常変数可)
; [array] ary3 : サブで管理する配列変数名 (通常変数可)
; [ var ] ary1_val : ary1の値もしくはそれを格納した変数
;
; *** comment ***
; 理想は引数の型を気にしなくて良いよう変数で渡したかったが
; 関数形式だと今の私の技術では実現出来そうにないため
; 文字列から実数、整数への変換が可能であることを利用して
; str関数を介することで文字列として(ary1_val)渡してもらうという方法を採っています
;
#defcfunc local union_ array ary1, array ary2, array ary3, str ary1_val
; uni_formatが設定されていなければこちらで設定する
if (uni_format = "") {uni_format = sfrmt(0)}
dim j : j = MDALiSrch_@myarray_srch(ary1_val, ary1)
; MDALiSrch関数は探索に失敗した場合は-1を返してくるので、-1とそれ以外とで場合分け
if (j = -1) {return strf(sfrmt(2), ary1_val)}
else: return strf(uni_format, ary1_val, uniary(ary2, j), uniary(ary3, j))
;-------------------------------------------------------------------------------
;
; 複数の多次元配列を1次元配列として扱う (ary1の値で直接指定)
;
; val = union(ary1, ary2, ary3, ary1_val)
;
; [array] ary1 : メインで管理する配列変数名
; [array] ary2 : サブで管理する配列変数名 (通常変数可)
; [array] ary3 : サブで管理する配列変数名 (通常変数可)
; [ var ] ary1_val : ary1の値もしくはそれを格納した変数
;
#define global ctype union(%1,%2,%3,%4) union_@myarray_list(%1,%2,%3,str(%4))
;-------------------------------------------------------------------------------
;
; 4つの多次元配列を1次元配列として扱う (ary1の値で直接指定)
;
; val = union4(ary1, ary2, ary3, ary4, ary1_val)
;
; [array] ary1 : メインで管理する配列変数名
; [array] ary2,ary3,ary4 : サブで管理する配列変数名 (通常変数可)
; [ var ] ary1_val : ary1の値もしくはそれを格納した変数
;
#defcfunc local union4_ array ary1, array ary2, array ary3, array ary4, str ary1_val
; uni_formatが設定されていなければこちらで設定する
if (uni_format = "") {uni_format = sfrmt(1)}
dim j : j = MDALiSrch_@myarray_srch(ary1_val, ary1)
; MDALiSrch関数は探索に失敗した場合は-1を返してくるので、-1とそれ以外とで場合分け
if (j = -1) {return strf(sfrmt(2), ary1_val)}
else: return strf(uni_format, ary1_val, uniary(ary2, j), uniary(ary3, j), uniary(ary4, j))
;-------------------------------------------------------------------------------
;
; 4つの多次元配列を1次元配列として扱う (ary1の値で直接指定)
;
; val = union4(ary1, ary2, ary3, ary4, ary1_val)
;
; [array] ary1 : メイン管理する配列変数名
; [array] ary2,ary3,ary4 : サブで管理する配列変数名 (通常変数可)
; [ var ] ary1_val : ary1の値もしくはそれを格納した変数
;
#define global ctype union4(%1,%2,%3,%4,%5) union4_@myarray_list(%1,%2,%3,%4,str(%5))
;-------------------------------------------------------------------------------
; #defcfunc uad array ary1, var v1
; return
;-------------------------------------------------------------------------------
;
; 連想配列設定
;
; #deffunc local asoc_init_ array ary1, var asoc_val, array key1, array key2, array key3, array key4
; dimtype ary1, vartype(asoc_val)
; dim asoc_info, 8, 5
; asoc_info_@myarray_core ary1, asoc_info, 0
; asoc_info_@myarray_core key1, asoc_info, 1
; asoc_info_@myarray_core key2, asoc_info, 2
; asoc_info_@myarray_core key3, asoc_info, 3
; asoc_info_@myarray_core key4, asoc_info, 4
; return
;-------------------------------------------------------------------------------
; #define global asocinit(%1,%2,%3="",%4="",%5="",%6="")\
; ac_value@myarray_list=%2 : \
; asoc_init_@myarray_list%1, ac_value@myarray_list, %3, %4, %5, %6
;-------------------------------------------------------------------------------
;
; 連想配列key設定
;
; #defcfunc local keyset_ array ary1, str key, int d1, local key_var
; key_var = TypeCnv(vartype(ary1), key)
; return
;-------------------------------------------------------------------------------
; #define global ctype kyeset(%1,%2,%3) keyset_@myarray_list(%1,str(%2),%3)
#global // myarray_list
; myarray_list モジュール内部で使用する変数の初期化です。
_myarray_list_init_@myarray_list
#endif //__myarray_list__