|
|
2023/1/16(Mon) 21:58:13|NO.98993
このモジュールでできること(2023/01/16)
* priarray命令
多次元配列変数を複数行文字列にする (確認用)
変数名,ラベル名,モジュール名の表示
* setarray命令
多次元配列変数に連続代入
インデックスの付与可
* labarray命令
文字列型をラベル型として扱う(かなり強引)
* outarray命令
多次元配列から複数行文字列へ(値だけ)
* cnvarray命令
複数行文字列、または多次元配列から別の多次元配列へ
次元の拡縮,型変換,配列のコピー
* ctlarray命令
* ctlarray_start
* ctlarray_end
* ctlexcld
上記6つの機能を任意の配列の範囲のみに限定
制御フィールド展開、複数の命令の動作範囲を一括制御
フィールド内での制御除外
* dimlinec関数
多次元配列を1次元化(平坦化)した要素数
(配列のオフセット値)を返す
* linedim命令
1次元化(平坦化)した要素数から
元の多次元配列の各次元要素数を返す
その他色々
|
|
2023/1/16(Mon) 22:11:48|NO.98995
2023/01/16づけでアップデートv0.27.1を、既にGitHubにて公開しています。
### 不具合修正 ###
* dimlinec関数のパラメータ条件式の抜けによる異常値処理の不具合の修正。
### その他 ###
追加分のヘルプファイルの項目追記と一部文言、言い回しの修正。
ソースコードの整備、修正。
今後のアップデート予定
1. 多次元配列どうしの四則演算
2. モジュール型変数を利用しない辞書?(リスト?)の実現
3. priarray命令のモジュール型変数の詳細表示(確認用)
4. 多次元配列の分割・結合
不具合報告や要望など、遠慮なくして頂けると幸いです。
|
|
2023/1/18(Wed) 18:08:47|NO.99004
多次元配列演算命令calc_ary(仮)です。
(priarrayとsetarrayの仕様が若干異なるのは無視して頂いて)
#module "myarray"
#deffunc local _myarray_init_
ldim jump, 5, 3
jump(0, 0) = *not_varpri@myarray, *priarray_1@myarray, *priarray_2@myarray, *priarray_3@myarray, *priarray_4@myarray
jump(0, 1) = *not_varset@myarray, *setarray_1@myarray, *setarray_2@myarray, *setarray_3@myarray, *setarray_4@myarray
jump(0, 2) = *not_varcal@myarray, *calc_ary_1@myarray, *calc_ary_2@myarray, *calc_ary_3@myarray, *calc_ary_4@myarray
sdim sfrmt, 512, 4, 2
sfrmt(0, 0) = "[ %s ] (%d)\n", "[ %s ] (%d, %d)\n", "[ %s ] (%d, %d, %d)\n", "[ %s ] (%d, %d, %d, %d)\n"
sfrmt(0, 1) = "(%d) = %s\n", "(%d, %d) = %s\n", "(%d, %d, %d) = %s\n", "(%d, %d, %d, %d) = %s\n"
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) : 配列の現在位置 (旧 num_)
#deffunc local 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
return
; if-else での変数の型による分岐用
#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
; イテレータ
#deffunc local dim_line_num_ array ary_inf_, array i_, int dim_ofset
repeat ary_inf_(4)
ary_inf_(6) = dim_ofset
repeat cnt: ary_inf_(6) /= ary_inf_(cnt) :loop
i_(cnt) = ary_inf_(6) \ ary_inf_(cnt)
loop
return
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
; 配列表示
#deffunc local priarray_dx str vname, var hyouj, array ary
hogestr = vname : hogestr = strtrim(hogestr, 3,)
dim vtype, 7 : dim ary_inf, 7 ; 配列の情報取得
typ_info_@myarray ary, vtype
dim_info_@myarray ary, ary_inf
dim i, 7 : hoge = 0
repeat 4: i(cnt) = ary_inf(cnt) :loop
gosub jump(ary_inf(4), 0)
dim i, 7 : hoge = 1
repeat ary_inf(5)
dim_line_num_@myarray ary_inf, i, i(4)
gosub jump(ary_inf(4), 0)
i(4)++
loop
hyouj += "\n"
return
//------------------------------- 配列書き出し -------------------------------//
*not_varpri@myarray
return
*priarray_1@myarray
if (hoge == 0) {hyouj += strf(sfrmt(0, 0), hogestr, i.0)}
else:if (hoge == 1) {hyouj += strf(sfrmt(0, 1), i.0, ary(i.0))}
return
*priarray_2@myarray
if (hoge == 0) {hyouj += strf(sfrmt(1, 0), hogestr, i.0, i.1)}
else:if (hoge == 1) {hyouj += strf(sfrmt(1, 1), i.0, i.1, ary(i.0, i.1))}
return
*priarray_3@myarray
if (hoge == 0) {hyouj += strf(sfrmt(2, 0), hogestr, i.0, i.1, i.2)}
else:if (hoge == 1) {hyouj += strf(sfrmt(2, 1), i.0, i.1, i.2, ary(i.0, i.1, i.2))}
return
*priarray_4@myarray
if (hoge == 0) {hyouj += strf(sfrmt(3, 0), hogestr, i.0, i.1, i.2, i.3)}
else:if (hoge == 1) {hyouj += strf(sfrmt(3, 1), i.0, i.1, i.2, i.3, ary(i.0, i.1, i.2, i.3))}
return
//==============================================================================
#define global priarray(%1,%2) priarray_dx@myarray "%2",%1,%2
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
; 連続代入
; ary : 代入先の配列変数
; in_v1 : 代入値またはそれを格納した変数
; iflg : indexフラグ(= 0, 0:OFF, 1:ON)
; idx : 増減値
#deffunc setarray array ary, var in_v1, int iflg, var idx
dim vtype, 7 : dim ary_inf, 7 ; 配列の情報取得
typ_info_@myarray ary, vtype
dim_info_@myarray ary, ary_inf
; 代入値が文字列の場合、インデックス付与のために一旦退避
sdim in_buf_ : sdim idx_buf_
if (iflg == 1) & (vtype(2)) {in_buf_ = in_v1 : idx_buf_ = idx}
dim i, 7
repeat ary_inf(5)
dim_line_num_@myarray ary_inf, i, i(4)
gosub jump(ary_inf(4), 1)
if (iflg == 1) & (vtype(2)) {
in_v1 = in_buf_
in_v1 += "" + idx_buf_
idx_buf_ += idx
}
else:if (iflg == 1) {in_v1 += idx}
i(4)++
loop
return
//--------------------------------- 配列代入 ---------------------------------//
*not_varset@myarray
return
*setarray_1@myarray
ary(i(0)) = in_v1
return
*setarray_2@myarray
ary(i(0), i(1)) = in_v1
return
*setarray_3@myarray
ary(i(0), i(1), i(2)) = in_v1
return
*setarray_4@myarray
ary(i(0), i(1), i(2), i(3)) = in_v1
return
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
; 多次元配列演算命令
; ans_ary : 計算結果を受け取る変数名 (ary1の変数型で初期化します)
; ary1, ary2 : 変数名 (ans_ary = ary1 + ary2 )
; calc_type : 演算タイプ (= 0, 0:加算+, 1:減算-, 2:乗算*, 3:除算/, 4:剰余\)
;
#deffunc calc_ary array ans_ary, array ary1, array ary2, int calc_type
dim vtype1, 7 : dim vtype2, 7 ; 型のチェック
typ_info_@myarray ary1, vtype1
typ_info_@myarray ary2, vtype2
; ラベル型、モジュール型、COMオブジェクト型は計算できない
; 文字列型の場合に加算以外を指定されたときも計算しない
;
if (vtype1(0) | vtype1(6) | vtype2(0) | vtype2(6)) {return -111111}
else:if (vtype1(2) | vtype2(2)) & (calc_type != 0) {return -222222}
;___________________________________________________________________________
dim ans_inf, 7 ; ans_ary 用の配列情報
dim ary_inf1, 7 : dim ary_inf2, 7 ; 詳細な情報の取得
dim_info_@myarray ary1, ary_inf1
dim_info_@myarray ary2, ary_inf2
; ans_ary はary1側の配列情報を使う (通常変数での計算時の仕様にならう)
;
foreach ary_inf1: ans_inf(cnt) = ary_inf1(cnt) :loop
; ans_ary の型はary1側に合わせる (通常変数での計算時の仕様にならう)
;
if vtype1(2) {sdim ans_ary, 1024, ans_inf(0), ans_inf(1), ans_inf(2), ans_inf(3)}
else {dimtype ans_ary, vartype(ary1), ans_inf(0), ans_inf(1), ans_inf(2), ans_inf(3)}
; ans_ary用 : ary1用 : ary2用
dim i, 7 : dim j, 7 : dim k, 7
dimtype ary1_, vartype(ary1)
dimtype ary2_, vartype(ary2)
repeat ans_inf(5)
dim_line_num_@myarray ary_inf1, j, j(4) ; 右辺の左側 (〜される数)
gosub jump(ary_inf1(4), 2)
i(5) = 1 ; 代入フラグ
dim_line_num_@myarray ary_inf2, k, k(4) ; 右辺の右側 (〜する数)
gosub jump(ary_inf2(4), 2)
i(5) = 2 ; 代入フラグ
dim_line_num_@myarray ans_inf, i, i(4) ; 左辺 (計算結果)
gosub jump(ans_inf(4), 2)
i(5) = 0 ; 代入フラグ
i(4)++ : j(4)++ : k(4)++
loop
return
//--------------------------------- 配列計算 ---------------------------------//
*not_varcal@myarray
return
*calc_ary_1@myarray
if (i.5 == 0) {ary1_ = ary1(j.0)}
else:if (i.5 == 1) {ary2_ = ary2(k.0)}
else:if (i.5 == 2) {ans_ary(i.0) = calc_var_@myarray(ary1_, ary2_, calc_type)}
return
*calc_ary_2@myarray
if (i.5 == 0) {ary1_ = ary1(j.0, j.1)}
else:if (i.5 == 1) {ary2_ = ary2(k.0, k.1)}
else:if (i.5 == 2) {ans_ary(i.0, i.1) = calc_var_@myarray(ary1_, ary2_, calc_type)}
return
*calc_ary_3@myarray
if (i.5 == 0) {ary1_ = ary1(j.0, j.1, j.2)}
else:if (i.5 == 1) {ary2_ = ary2(k.0, k.1, k.2)}
else:if (i.5 == 2) {ans_ary(i.0, i.1, i.2) = calc_var_@myarray(ary1_, ary2_, calc_type)}
return
*calc_ary_4@myarray
if (i.5 == 0) {ary1_ = ary1(j.0, j.1, j.2, j.3)}
else:if (i.5 == 1) {ary2_ = ary2(k.0, k.1, k.2, k.3)}
else:if (i.5 == 2) {ans_ary(i.0, i.1, i.2, i.3) = calc_var_@myarray(ary1_, ary2_, calc_type)}
return
//##############################################################################
; 配列演算関数 (分岐用)
; v1, v2 : ary1, ary2
; calc_type : 演算タイプ
#defcfunc local calc_var_ var v1, var v2, int calc_type, local prm_ch
prm_ch = ((calc_type == 3) | (calc_type == 4)) & (v2 == 0) ; 0除算チェック
if prm_ch & (vartype(v1) == 4) {return -2147483648} ;ここと下の返り値はテキトー
else:if prm_ch & (vartype(v1) == 3) {return -214748364.8} ;とりあえず何か返さないといけないので
else:if (calc_type == 0) {return (v1 + v2)} ; 加算
else:if (calc_type == 1) {return (v1 - v2)} ; 減算
else:if (calc_type == 2) {return (v1 * v2)} ; 乗算
else:if (calc_type == 3) {return (v1 / v2)} ; 除算
else:if (calc_type == 4) {return (v1 \ v2)} ; 剰余
#global // myarray
_myarray_init_@myarray ; モジュール内変数の初期化
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
//////////////////////////////// 以下サンプル //////////////////////////////////
/*** 表示用 ***/
sdim moni0, 1024 : sdim moni1, 1024 : sdim moni2, 1024
screen 0, 810, 480 : font "メイリオ", 12 : objmode 2, 1
pos 0, 0 : mesbox moni0, 270, 480, 12
pos 270, 0 : mesbox moni1, 270, 480, 12
pos 540, 0 : mesbox moni2, 270, 480, 12
/*** 変数の用意 ***/
ddim a, 5, 4
input_a = 0.0 ; 初期値
index_a = 5.2 ; 増減値
setarray a, input_a, 1, index_a : priarray moni1, a
dim b, 4, 3
input_b = 0 ; 初期値
index_b = 1 ; 増減値
setarray b, input_b, 1, index_b : priarray moni2, b
/*** 演算 ***/
calc_ary c, a, b : moni0 += "加算\n"
priarray moni0, c
calc_ary c, a, b, 1 : moni0 += "減算\n"
priarray moni0, c
calc_ary c, a, b, 2 : moni0 += "乗算\n"
priarray moni0, c
calc_ary c, a, b, 3 : moni0 += "除算\n"
priarray moni0, c
calc_ary c, a, b, 4 : moni0 += "剰余\n"
priarray moni0, c
objprm 0, moni0 : objprm 1, moni1 : objprm 2, moni2
stop
| |
|
2023/1/18(Wed) 19:42:01|NO.99005
現状こんな感じの仕様になっています
(正しくは、"こういう動きをさせているつもりです")
* 多次元配列演算命令 (仮)
calc_ary ans_ary, ary1, ary2, calc_type
※イメージ ans_ary = ary1 + ary2
1. calc_typeの指定値は、
0 : 加算 (+) (←省略時)
1 : 減算 (-)
2 : 乗算 (*)
3 : 除算 (/)
4 : 剰余 (\)
2. 解答を受け取る配列(ans_ary)は、HSPの通常計算時の仕様にならって、
"変数の型" と "各次元要素数" を 無条件 でary1に合わせる。
3. ary1よりも、ary2の方が配列として短い場合は短い分だけ周回する。
また、ary2の方が長い場合はary1の長さで計算を終える。
つまるところ総計算回数はary1の長さになる
(これは上の仕様2に合わせるため)
(※便宜上わかりやすくするためのイメージです)
例) dim ary1, 5, 2 : dim ary2, 3
ary1(0, 0) + ary2(0)
ary1(1, 0) + ary2(1)
ary1(2, 0) + ary2(2) ; ←ary2はここで終了 (配列の長さ3)
ary1(3, 0) + ary2(0) ; ary1がまだ続いているので、ary2は2周目に入る
ary1(4, 0) + ary2(1)
:
ary1(4, 1) + ary2(0) ; ary1がここで終了 よって配列演算を終了
上の例だとary1の長さが 5 * 2 = 10 なので総計算回数は10回、
解答を受け取るans_aryも長さが10になる
|
|
2023/1/21(Sat) 16:50:35|NO.99017
大型アップデート v0.27.3 (1番上のURLから行けます)
今回は多次元配列どうしを計算する命令の新規追加です
; 配列演算命令
; ans_ary : 解答を受け取る変数名
; ary1, ary2 : 変数名
; calc_type : 演算タイプ
; error_stop : 0除算フラグ
calc_ary ans_ary, ary1, ary2, calc_type, error_stop
; ans_ary = ary1 + ary2 (※イメージ)
; 演算継続命令
calc_continue
動作制御系命令(ctl〜)に対応しているので、
配列の一部分のみを計算させることが可能です。
制御フィールド内で用いる際は、少々手間ですが
calc_continue命令を直前に置くことで、ans_aryが
都度初期化されるのを防ぎ、異なる計算を同じ変数で
受け取ることが可能です。
|
|
2023/1/22(Sun) 16:06:24|NO.99022
今回からテスト版と安定版を分けてみました。
安定版とは、これまでどおりのモノで、
テスト版とは、製作途中のモノであったり、構想中で
アウトラインしかできていないモノなどです。
ということで早速test1にアップデートです。
多次元配列を1次元配列として扱う
* uniary関数
mes uniary(ary1, 75)
特にこれといった機能はありませんが、
2,3,4次元配列を1次元配列の要素数で管理できるので、
これを踏み台として複数の多次元配列をまとめて管理できないか?
と、色々試行錯誤中です。
私のツイート:安定版とテスト版の切り替え方
https://twitter.com/YUZRANIUM/status/1617049723004948482
(テスト版のダウンロードは上のURL先、緑色のCodeボタンから)
|
|
2023/2/2(Thu) 20:20:30|NO.99068
アップデートしました。v0.28
新規追加命令・関数
* val = uniary(ary1, dim_ofset)
多次元配列変数を1次元配列として扱う
* val = union(ary1, ary2, ary3, ary1_val)
複数の多次元配列変数をまとめて1次元配列として扱う
(ary1の値でまとめる)
* val = union_d(ary1, ary2, ary3, dim_ofset)
複数の多次元配列変数をまとめて1次元配列として扱う
(配列のオフセット値 (1次元化要素数) でまとめる)
* uniformat "書式文字列"
union, union_d関数の書式設定
(呼び出されなかった場合はモジュール内のデフォ書式が適用)
* MDABiSrch item, srch_ary, srch
二分木探索命令 (多次元配列仕様)
* val = MDALiSrch(item, srch_ary)
線形探索関数 (多次元配列仕様)
|
|
2023/2/2(Thu) 20:43:12|NO.99069
変更・修正など
今バージョン(v0.28)からモジュールの肥大化に伴い、
myarrayモジュールを機能と役割でファイルごと分割しました。
ただ、v0.27.3以前のものと互換性は保たれているハズ(ちょっと自信ない;)
なので特に気にされる必要はないかと。
各モジュールの説明
* myarray_core モジュール (02_myarray_core.hsp)
ほぼすべての命令・関数の中核を担うイテレータなどを
内部命令化・関数化し、定義する本プロジェクト最重要モジュールです
dimlinec関数やlinedim命令など
* myarray_list モジュール (02_myarray_list.hsp)
このモジュールは主に多次元配列を1次元配列として扱うものや、
配列をリストのように扱うといったデータ管理用途の機能を集めたものです
未だ開発途中で実験的なのもでもあり、今後の開発やアップデートの中心になリます
uniary関数やunion関数など
* myarray_srch モジュール (02_myarray_srch.hsp)
ソートや線形探索・二分木探索など、
ユーザーに提供する一部機能の前処理を行うものです
MDALiSrch関数やMDABiSrch命令など
* myarray モジュール (02_myarray.hsp)
ユーザー提供機能をまとめたモジュールで、本プロジェクトの本体です
ラベル型変数、モジュール型変数へのアクセスを行うポインタ関連、
配列制御関連の内部命令、pri, set, out, cnv, labarray命令の
各内部命令とマクロ、配列演算命令など
02_myarray.hspで各ヘッダファイルを#additionしているので
使用する際は今まで通り手元のソースコード側で
#include "02_myarray.hsp"
とするだけで利用できます。
不具合や要望、気になったことなど気軽にして頂ければ幸いです。
|
|
2023/2/9(Thu) 18:54:53|NO.99098
多次元配列の二分木探索命令MDABiSrchの文字列型対応テストです。
現状、HSP3では文字列を直接大小比較することはできません。
(多言語については知らない;)
二分木探索はその性質上、数値型ならいざしらず、文字列型を扱うとなると一工夫必要です。
ということで、ASCIIコードへ変換、比較を行うことで実現してみました。
ただ、「肝心の多次元配列対応のソート系が作れていない」という点で存在意義に欠けます。
今後は多次元配列対応のソート系も作ろうかと思います。
ついでにASCIIコードから文字列へ復元する関数も付いて来ます。
#module "myarray"
#deffunc local myarray_init_
ldim jump, 5, 2
jump(0, 0) = *not_varuni@myarray, *uniarycf_1@myarray, *uniarycf_2@myarray, *uniarycf_3@myarray, *uniarycf_4@myarray
return
;-----------------------------------------------------------
; 配列情報
; ary_inf(0) : length() (1次元要素数)
; ary_inf(1) : length2() (2次元要素数)
; ary_inf(2) : length3() (3次元要素数)
; ary_inf(3) : length4() (4次元要素数)
; ary_inf(4) : 使用次元数 (1, 2, 3, 4)
; ary_inf(5) : 配列の長さ
; ary_inf(6) : 配列の変数型
; ary_inf(7) : 配列の現在位置
#deffunc local dim_info_ array ary, array ary_inf_
dim ary_inf_, 8
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
;-----------------------------------------------------------
; if-else での変数の型による分岐用
#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次元化要素数) から各次元要素へ
#deffunc local dim_line_num_ array ary_inf_, array i_, int dim_ofset
repeat ary_inf_(4)
ary_inf_(7) = dim_ofset
repeat cnt: ary_inf_(7) /= ary_inf_(cnt) :loop
i_(cnt) = ary_inf_(7) \ ary_inf_(cnt)
loop
return
;-----------------------------------------------------------
; 多次元配列を1次元配列として扱う (業務用)
;
; [ int ] ary1 : 変数名
; [array] dim_ofset : 配列のオフセット値 (1次元化要素数)
; [array] ary_inf_ : 配列情報変数名
;
#defcfunc local uniary_ array ary1, int dim_ofset, array ary_inf_
; 配列のオフセット値(1次元化要素数)から本来の各次元要素数を復元
dim i, 7 : dim_line_num_@myarray ary_inf_, i, dim_ofset
gosub jump(ary_inf_(4), 0) ; ラベルジャンプで分岐
return
;-----------------------------------------------------------
; 多次元配列を1次元配列として扱う (ユーザー用)
;
; [ int ] ary1 : 変数名
; [array] dim_ofset : 配列のオフセット値 (1次元化要素数)
;
#defcfunc uniary array ary1, int dim_ofset
; 配列情報の取得
dim ary_inf, 8 : dim_info_@myarray ary1, ary_inf
; 配列のオフセット値(1次元化要素数)から本来の各次元要素数を復元
dim i, 7 : dim_line_num_@myarray ary_inf, i, dim_ofset
; ラベルジャンプで分岐
gosub jump(ary_inf(4), 0)
return
//------------------------------- 配列書き出し -------------------------------//
*not_varuni@myarray
return
; junp(1, 0)
*uniarycf_1@myarray
return ary1(i(0))
; junp(2, 0)
*uniarycf_2@myarray
return ary1(i(0), i(1))
; junp(3, 0)
*uniarycf_3@myarray
return ary1(i(0), i(1), i(2))
; junp(4, 0)
*uniarycf_4@myarray
return ary1(i(0), i(1), i(2), i(3))
;-----------------------------------------------------------
; 文字列からASCIIコードに変換
;
; [array] ary1 : ASCIIコードを受け取る変数名
; [ str ] s1 : 変換したい文字列
;
#deffunc str2ASCI array ary1, str s1
; バイト数を得るために変数に代入
byte_size_var_ = s1 : notesel byte_size_var_
dim ary1, notesize
; 文字列をASCIIコードに
repeat notesize
ary1(cnt) = peek(byte_size_var_, cnt)
loop
ary1(notesize) = 0 ; 終了コード
return
;-----------------------------------------------------------
; ASCIIコードから文字列に変換
;
; [array] ary1 : ASCIIコードを格納した変数名
;
; *** 返り値 ***
; refstr : 復元した文字列
;
#defcfunc ASCI2str array ary1, local hoge_
sdim restr_, 64
repeat length(ary1)
getstr hoge_, ary1(cnt), 0
restr_ += hoge_
loop
return restr_
;-------------------------------------------------------------------------------
; 大小比較
;
; [array] ary1,ary2 : ASCIIコードを格納した変数名
; [ int ] p1 : 返りフラグ (= 0, 0:小さい方 / 1:大きい方)
;
; *** 返り値 ***
; stat : 比較結果
; : 0:完全一致
; : 1:第一パラメータ
; : 2:第二パラメータ
;
#defcfunc ASCIcomp array ary1, array ary2, int p1
; 大小ポイント
dim ary1_pt, 2
dim ary2_pt, 2
dim j
; 比較回数は小さい方に合わせる 文字数の大きい方に1pt
if (length(ary1) < length(ary2)) {j = length(ary1) : ary2_pt(1)++}
else:if (length(ary1) > length(ary2)) {j = length(ary2) : ary1_pt(1)++}
else {j = length(ary1)}
; 大きい方に1pt入る. 同じ場合はpt入れないで次のコード比較
repeat j
if (ary1(cnt) < ary2(cnt)) {ary2_pt++ : break}
else:if (ary1(cnt) > ary2(cnt)) {ary1_pt++ : break}
loop
; p1 = 0 のときは小さい方を, p1 = 1 のときは大きい方を返す
if (ary1_pt(0) < ary2_pt(0)) & p1 {return 2} ; 第2パラメータの文字列が大きい
else:if (ary1_pt(0) > ary2_pt(0)) & p1 {return 1} ; 第1パラメータの文字列が大きい
else:if (ary1_pt(1) < ary2_pt(1)) & p1 {return 2} ; 文字数の長いほうが大きい
else:if (ary1_pt(1) > ary2_pt(1)) & p1 {return 1} ;
else:if (ary1_pt(0) < ary2_pt(0)) {return 1}
else:if (ary1_pt(0) > ary2_pt(0)) {return 2}
else:if (ary1_pt(1) < ary2_pt(1)) {return 1}
else:if (ary1_pt(1) > ary2_pt(1)) {return 2} else {return 0}
;-------------------------------------------------------------------------------
; 二分木探索命令 (多次元配列仕様)
;
; [ var ] item_ : 探す値
; [array] srch_ary : 探す場所(多次元配列変数) ※注意! 昇順ソートされている事が前提
; [array] srch_ : 探す場所の配列要素数を受け取る変数
;
; 要素数格納用
; srch_(0) : midle
; srch_(1) : low
; srch_(2) : high
;
#deffunc local MDABiSrch_ str item_, array srch_ary, array srch_
dim_info_@myarray srch_ary, srch_ary_inf_ ; 配列情報の取得
typ_info_@myarray srch_ary, vtype ; 型の分起用
dim srch_, 4
srch_(2) = srch_ary_inf_(5) - 1
if vtype(2) { ; 文字列型の場合
str2ASCI item_asci, item_ ; 探索文字列をASCIIコードに変換
repeat
srch_.0 = (srch_.1 + srch_.2) / 2
; 比較サンプル文字列をASCIIコードに変換 (uniaryで1次元化)
str2ASCI asci_ary, uniary_@myarray(srch_ary, srch_.0, srch_ary_inf_)
; 探索文字列と比較サンプルのASCIIコードを比較.
; 短い方の引数(パラメータ)番号が返ってくる
; 第一引数: ↓ ↓ :第二引数
srch_ary_var_ = ASCIcomp(item_asci, asci_ary, 0)
if ((srch_.1 <= srch_.2) != 1) {srch_.0 = -1 : break}
else:if (srch_ary_var_ = 0) {break} ; 完全一致
else:if (srch_ary_var_ = 1) {srch_.2 = srch_.0 - 1} ; 第一引数 (探索文字列) が小さい
else:if (srch_ary_var_ = 2) {srch_.1 = srch_.0 + 1} ; 第二引数 (比較サンプル) が小さい
loop
}
else { ; 実数型、整数型の場合 (通常の二分木探索)
if vtype(3) {srch_ary_var_ = double(item_)}
else:if vtype(4) {srch_ary_var_ = int(item_)}
repeat
srch_.0 = (srch_.1 + srch_.2) / 2
srch_.3 = uniary_@myarray(srch_ary, srch_.0, srch_ary_inf_)
if ((srch_.1 <= srch_.2) != 1) {srch_.0 = -1 : break}
else:if (srch_ary_var_ = srch_.3) {break}
else:if (srch_ary_var_ < srch_.3) {srch_.2 = srch_.0 - 1}
else {srch_.1 = srch_.0 + 1}
loop
}
return
;-------------------------------------------------------------------------------
#define global MDABiSrch(%1,%2,%3) MDABiSrch_@myarray str(%1),%2,%3
#global //// 以下サンプル ////
myarray_init_@myarray
objsize 150, 25, 10
sdim inp_box, 64 : dim hMes : dim hInp
input inp_box, 250, 25 : hInp(0) = objinfo(stat, 2)
button gosub "Srch", *srch_item : hMes(0) = objinfo(stat, 2)
sdim data, 1024, 10, 2
data(0, 0) = "12.7サンチ連装高角砲"
data(1, 0) = "1234567890!?+-*/\\<>[](){}"
data(2, 0) = "12粍28連噴進砲"
data(3, 0) = "30.5cm三連装砲"
data(4, 0) = "45口径46cm三連装砲"
data(5, 0) = "@\"#$%&\'`=~^|,./*-+.0123456789"
data(6, 0) = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
data(7, 0) = "abcdefghijklmnopqrstuvwxyz"
data(8, 0) = "あいうえお_アイウエオ"
data(9, 0) = "かきくけこ_カキクケコ"
data(0, 1) = "さしすせそ_サシスセソ"
data(1, 1) = "たちつてと_タチツテト"
data(2, 1) = "なにぬねの_ナニヌネノ"
data(3, 1) = "はひふへほ_ハヒフヘホ"
data(4, 1) = "や ゆ よ_ヤ ユ ヨ"
data(5, 1) = "らりるれろ_ラリルレロ"
data(6, 1) = "わゐうゑをん_ワヰウヱヲン"
data(7, 1) = "ウナゲリヲン"
data(8, 1) = "魑魅魍魎が跋扈するyea"
data(9, 1) = "魑魅魍魎が跋扈する家"
stop
*srch_item
MDABiSrch inp_box, data, i
if (i == -1) {dialog str(inp_box) + " IS NOT FOUND", 1, "MDABiSrch"}
else {dialog uniary(data, i) + " IS FOUND", 0, "MDABiSrch"}
str2ASCI ascii_, inp_box
mes ASCI2str(ascii_)
return
| |
|
2023/2/27(Mon) 15:12:27|NO.99135
テスト版アップデートv0.28.1
新規追加命令・関数
val = union4(ary1, ary2, ary3, ary4, ary1_val)
val = union4d(ary1, ary2, ary3, ary4, dim_ofset)
;
; それぞれunion, union_d関数の上位版で、4つの多次元配列変数をまとめて扱う
str2ASCI ary1, "文字列"
;
; 文字列をASCIIコードに変換
; 指定文字列を先頭から1byteずつ変換していくので全角文字・2バイトコードにも対応
; ary1に指定した変数を1次元整数型配列で初期化、10進数ASCIIが読み出される
; 改行コードは読み出せない
val = ASCI2str(ary1)
;
; ASCIIコードを文字列に変換
; 指定した1次元整数型配列の値をASCIIコードとしてgetstrで読み出し、読み出し文字列を返す。
val = ASCIcomp(ary1, ary2, p1)
;
; 文字列をASCIIコードで比較
; ary1, ary2のASCIIコードの大小比較を行う。p1省略時は小さい方、1のときは大きい方を返す。
; 第一引数に指定した方が小さい(大きい)場合は1、
; 第二引数に指定した方が小さい(大きい)場合は2、
; 完全一致は0が帰る。
|
|
2023/2/27(Mon) 15:22:42|NO.99136
追加・変更
* calc_aryの演算タイプに9(べき乗)を新たに追加
それに伴い、演算タイプが9(べき乗)の場合、
解答を受け取る変数の型を強制的に実数型とするように調整
* bisrch, MDABiSrch命令を文字列型変数へ対応可能に
その他、ヘルプファイル追加、ソースコード整備等
今後はbisrch, MDABiSrch命令用に多次元配列変数のソート命令や
三角関数、数列の出力などなど多次元配列に関連した機能や命令・関数を
制作していく予定です。
また、私事で申し訳ないのですが、私生活が忙しくなりつつあり、
今後の開発や更新が少々遅れてしまいます。
不具合等は可能な限り優先して対応していき、
時間を見つけてゆっくり更新していこうかと思います。
不具合等なにかありましたらこちらに遠慮なくして頂けると幸いです。
|
|
2023/3/2(Thu) 16:17:23|NO.99144
こちらのスレッド
http://hsp.tv/play/pforum.php?mode=pastwch&num=67877の
FunnyMaker氏の"Wikipedia C言語実装例"という再帰型クイックソートを参考に
多次元配列仕様へ改造してみました。
とりあえず動くモノを、ということで実行速度を投げ捨てたため、(笑)
a(20, 20, 20, 20)の総数16万のソートも可能です (20〜30秒程かかりますが)
#module "sort_test"
#deffunc local sort_init_
ldim jump, 5, 2
jump(0, 0) = *not_varuni@sort_test, *uniarycf_1@sort_test, *uniarycf_2@sort_test, *uniarycf_3@sort_test, *uniarycf_4@sort_test
jump(0, 1) = *not_uniary@sort_test, *uniarray_1@sort_test, *uniarray_2@sort_test, *uniarray_3@sort_test, *uniarray_4@sort_test
dim pvt_tmp, 3
d_ = 0
exch_tmp = 0
dim pivot ; ピボット
return
;-----------------------------------------------------------
; [ int ] p1 : 型のタイプ値 (2:文字列型 / 3:実数型 / 4:整数型)
; [ str ] s1 : 変換する値
#defcfunc local type_cnv_ int p1, str s1
if (p1 == 2) {return str(s1)}
else:if (p1 == 3) {return double(s1)}
else:if (p1 == 4) {return int(s1)}
;-----------------------------------------------------------
; 配列情報
; ary_inf(0) : length() (1次元要素数)
; ary_inf(1) : length2() (2次元要素数)
; ary_inf(2) : length3() (3次元要素数)
; ary_inf(3) : length4() (4次元要素数)
; ary_inf(4) : 使用次元数 (1, 2, 3, 4)
; ary_inf(5) : 配列の長さ
; ary_inf(6) : 配列の変数型
; ary_inf(7) : 配列の現在位置
#deffunc local dim_info_ array ary, array ary_inf_
dim ary_inf_, 8
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
;-----------------------------------------------------------
; 配列のオフセット値 (1次元化要素数) から各次元要素へ
#deffunc local dim_line_num_ array ary_inf_, array i_, int dim_ofset
repeat ary_inf_(4)
ary_inf_(7) = dim_ofset
repeat cnt: ary_inf_(7) /= ary_inf_(cnt) :loop
i_(cnt) = ary_inf_(7) \ ary_inf_(cnt)
loop
return
;-----------------------------------------------------------
; 多次元配列を1次元配列として扱う (業務用)
;
; [ int ] ary1 : 変数名
; [array] dim_ofset : 配列のオフセット値 (1次元化要素数)
; [array] ary_inf_ : 配列情報変数名
;
#defcfunc local uniary_ array ary1, int dim_ofset, array ary_inf_
; 配列のオフセット値(1次元化要素数)から本来の各次元要素数を復元
dim i, 7 : dim_line_num_@sort_test ary_inf_, i, dim_ofset
gosub jump(ary_inf_(4), 0)
return
//------------------------------- 配列書き出し -------------------------------//
*not_varuni@sort_test
return
; junp(1, 0)
*uniarycf_1@sort_test
return ary1(i(0))
; junp(2, 0)
*uniarycf_2@sort_test
return ary1(i(0), i(1))
; junp(3, 0)
*uniarycf_3@sort_test
return ary1(i(0), i(1), i(2))
; junp(4, 0)
*uniarycf_4@sort_test
return ary1(i(0), i(1), i(2), i(3))
;-------------------------------------------------------------------------------
; 多次元配列を1次元配列として扱う (代入用)
;
; [ int ] ary1 : 変数名
; [array] dim_ofset : 配列のオフセット値 (1次元化要素数)
; [ var ] in_val : 代入値
;
#deffunc local uniaryf_ array ary1, int dim_ofset, str in_val
; 配列情報の取得
dim ary_inf, 8 : dim_info_@sort_test ary1, ary_inf
; 配列のオフセット値(1次元化要素数)から本来の各次元要素数を復元
dim i, 7 : dim_line_num_@sort_test ary_inf, i, dim_ofset
; ラベルジャンプで分岐
gosub jump(ary_inf(4), 1)
return
//------------------------------- 配列書き出し -------------------------------//
*not_uniary@sort_test
return
*uniarray_1@sort_test
ary1(i(0)) = type_cnv_@sort_test(vartype(ary1), in_val)
return
*uniarray_2@sort_test
ary1(i(0), i(1)) = type_cnv_@sort_test(vartype(ary1), in_val)
return
*uniarray_3@sort_test
ary1(i(0), i(1), i(2)) = type_cnv_@sort_test(vartype(ary1), in_val)
return
*uniarray_4@sort_test
ary1(i(0), i(1), i(2), i(3)) = type_cnv_@sort_test(vartype(ary1), in_val)
return
;-----------------------------------------------------------
;
#define global uniaryf(%1,%2,%3) uniaryf_@sort_test%1,%2,str(%3)
;-----------------------------------------------------------
; 中間値を返す (数値用)
;
#defcfunc local get_pvt_num_ array ary, int d1, int d2, int dim_sw
d_ = (d1 + (d2 - d1) / 2)
if dim_sw {
pvt_tmp(0) = uniary_@sort_test(ary, d1, ary_inf)
pvt_tmp(1) = uniary_@sort_test(ary, d2, ary_inf)
pvt_tmp(2) = uniary_@sort_test(ary, d_, ary_inf)
}
else {pvt_tmp(0) = ary(d1), ary(d2), ary(d_)}
if (pvt_tmp(0) < pvt_tmp(1)) {
if (pvt_tmp(1) < pvt_tmp(2)) {return pvt_tmp(1)}
else:if (pvt_tmp(2) < pvt_tmp(0)) {return pvt_tmp(0)} else {return pvt_tmp(2)}
}
else {
if (pvt_tmp(2) < pvt_tmp(1)) {return pvt_tmp(1)}
else:if (pvt_tmp(0) < pvt_tmp(2)) {return pvt_tmp(0)} else {return pvt_tmp(2)}
}
;-----------------------------------------------------------
; クイックソート (1次元数値型)
;
#deffunc local q_sort_uni_num_ array ary1, int frst_idx, int last_idx, \
local frst_, local last_
if (frst_idx > last_idx) : return
frst_ = frst_idx ; ピボットの左側 (ピボットよりも小さい方)
last_ = last_idx ; ピボットの右側 (ピボットよりも大きい方)
pivot = get_pvt_num_@sort_test(ary1, frst_, last_)
repeat
; pivotより小さい値が見つかるまで増加
repeat: if (pivot <= ary1(frst_)) {break} else {frst_++} :loop
; pivotより大きい値が見つかるまで減少
repeat: if (ary1(last_) <= pivot) {break} else {last_--} :loop
if (last_ <= frst_) {break}
; 入れ替え
exch_tmp = ary1(frst_) : ary1(frst_) = ary1(last_) : ary1(last_) = exch_tmp
frst_++ : last_--
loop
q_sort_uni_num_@sort_test ary1, frst_idx, frst_ - 1
q_sort_uni_num_@sort_test ary1, last_ + 1, last_idx
return
;-----------------------------------------------------------
; クイックソート (多次元数値型)
;
#deffunc local q_sort_mlt_num_ array ary1, int frst_idx, int last_idx, \
local frst_, local last_
if (frst_idx > last_idx) : return
frst_ = frst_idx ; ピボットの左側 (ピボットよりも小さい方)
last_ = last_idx ; ピボットの右側 (ピボットよりも大きい方)
pivot = get_pvt_num_@sort_test(ary1, frst_, last_, 1)
repeat
; pivotより小さい値が見つかるまで増加
repeat
frst_val_ = uniary_@sort_test(ary1, frst_, ary_inf)
if (pivot <= frst_val_) {break} else {frst_++}
loop
; pivotより大きい値が見つかるまで減少
repeat
last_val_ = uniary_@sort_test(ary1, last_, ary_inf)
if (last_val_ <= pivot) {break} else {last_--}
loop
if (last_ <= frst_) {break}
; 入れ替え
uniaryf ary1, last_, frst_val_
uniaryf ary1, frst_, last_val_
frst_++ : last_--
loop
q_sort_mlt_num_@sort_test ary1, frst_idx, frst_ - 1
q_sort_mlt_num_@sort_test ary1, last_ + 1, last_idx
return
;-------------------------------------------------------------------------------
; 外部インターフェイス用 (マクロでも良い?)
;
#deffunc qsort array ary1, int frst_idx, int last_idx, \
local prm_chk_q_
dim ary_inf, 8 : dim_info_@sort_test ary1, ary_inf
prm_chk_q_(0) = ((ary_inf(4) = 1) & (ary_inf(6) ! 2)) ; 1次元 & 数値型
prm_chk_q_(1) = ((ary_inf(4) = 1) & (ary_inf(6) = 2)) ; 1次元 & 文字列型
prm_chk_q_(2) = ((ary_inf(4) > 1) & (ary_inf(6) ! 2)) ; 多次元 & 数値型
prm_chk_q_(3) = ((ary_inf(4) > 1) & (ary_inf(6) = 2)) ; 多次元 & 文字列型
if prm_chk_q_(0) {q_sort_uni_num_@sort_test ary1, frst_idx, last_idx}
else:if prm_chk_q_(1) {} ; 1次元文字列型用 (未開発)
else:if prm_chk_q_(2) {q_sort_mlt_num_@sort_test ary1, frst_idx, last_idx}
else:if prm_chk_q_(3) {} ; 多次元文字列型用 (未開発)
return
#global //////////////////// 以下サンプル ////////////////////
sort_init_@sort_test ; モジュール内部変数の初期化
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
; 管理用変数
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
#const buf_size 1024
sdim moni0, buf_size ; 表示用
sdim moni1, buf_size ; 表示用
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
; ウィンドウオブジェクト
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
screen 0, 600, 700 : font "メイリオ", 12 : objmode 2, 1
pos 0, 0 : mesbox moni0, 300, 700
pos 300, 0 : mesbox moni1, 300, 700
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
; 検証用変数
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
; 配列要素数
#const dim_1 10
#const dim_2 10
#const dim_3 10
#const dim_4 10
dim a, dim_1, dim_2, dim_3, dim_4
; 配列の長さ計算用
#const comp_chk ((dim_1 ! 0) + (dim_2 ! 0) + (dim_3 ! 0) + (dim_4 ! 0))
if (comp_chk = 1) {dim_size = dim_1}
else:if (comp_chk = 2) {dim_size = dim_1 * dim_2}
else:if (comp_chk = 3) {dim_size = dim_1 * dim_2 * dim_3}
else:if (comp_chk = 4) {dim_size = dim_1 * dim_2 * dim_3 * dim_4}
randomize ; ランダムな値
repeat dim_size: uniaryf a, cnt, rnd(dim_size) :loop
dim ary_inf, 8 : dim_info_@sort_test a, ary_inf
moni0 += "ソート前" : repeat dim_size: moni0 += "\n" + uniary_@sort_test(a, cnt, ary_inf) :loop
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
; 処 理
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
qsort a, 0, dim_size - 1
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
; 表示内容更新
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
moni1 += "ソート後" : repeat dim_size: moni1 += "\n" + uniary_@sort_test(a, cnt, ary_inf) :loop
objprm 0, moni0
objprm 1, moni1
stop
| |
|
2023/3/2(Thu) 16:18:33|NO.99146
こちらのサンプルでは内部で配列の1次元化関数uniaryを利用しているため
2,3,4次元配列変数はもちろん、1次元配列変数でも動作するはずですが、
スタック領域のオーバーフローや実行速度()の問題から、
1次元配列用と多次元配列用とで分けてみました。
また、先日のアップデートで追加された文字列を数値に変換し、比較する
str2ASCI命令とASCIcomp関数を利用することで文字列型対応のクイックソート
も作れるかと思いますが、やはり怖いのがスタック領域のオーバーフローです。
可能かどうかはさておき、
スタック領域を増やす術は今の私にはありませんので、
今後は領域節約と実行速度()という方向で
* 1次元 数値型 仕様
* 多次元 数値型 仕様
* 1次元 文字列型 仕様
* 多次元 文字列型 仕様
の4つに内部命令を分けて開発を行おうかなと思っている次第です。
|
|
2023/4/1(Sat) 19:07:05|NO.99243
大変遅くなってしまい申し訳
大型アップデートv0.28.3
新規追加命令・関数
dim_info ary1, ary_info
;
; 配列情報の取得(local指定だったものに修正を加えて一般公開)
val = uniary_(ary1, dim_ofset, ary1_info)
;
; uniary関数のループ内使用に最適化(内部でdim_info命令の呼出しをやめた)
Auniary ary1, dim_ofset, in_val, ary1_info
;
; ループ内で多次元配列変数に連続代入
MDAQSort ary1, mode, frst, last
;
; クイックソート
; modeを省略か0指定で昇順、1指定で降順
; frst, last省略で全区間を、それぞれ指定することでその区間をソーティング対象とする
;(ary1が1次元なのか多次元か、文字列型なのか数値型か、で呼び出す内部命令が変わる)
MFCQSort ary1, mode, frst, last
;
; 多機能複合型クイックソート(試験的に作った)
; 機能自体は上と同じだけど、内部構造を一つに統合したもの。
|
|
2023/4/1(Sat) 19:08:29|NO.99244
今回のクイックソートはどちらも
文字列型、実数型、整数型の1〜4次元配列変数に対応しています。
機能的な違いはありませんが、内部構造が少し異なります。
MDAQSort命令は私の投稿NO.99146にある通り、呼び出される内部命令は4つあり、
ソーティング対象変数に応じて呼び出す内部命令を変えるというものです。
一方、MFCQSortは多機能複合型(Multi Function Compound model)ということで
4つの内部命令の各機能を一つに統合したものとなっています。
しかし、クイックソートの実行速度は皆さん御存知の通り
ピボットの選択に大きく左右されるということで
何度か小規模の耐久試験を行ったのですが、
MFCQSort命令でスタック領域のオーバーフローは起きませんでした(笑)
今回クイックソートに合わせて作ったピボット選択関数(local指定)は
サンプルを3つ取り出してその中央値を返すという簡単な作りになっています。
以下、耐久試験
※1分ぐらい帰って来ません
#include "02_myarray.hsp"
sdim test, 2048, 20, 20, 20, 20
dim_info test, testinfo
randomize
repeat testinfo(5)
Auniary test, cnt, str( rnd( testinfo.5 ) ), testinfo
loop
MFCQSort test
stop
|
|