white_spaceでstack構造をデータ型の一つにしてるので
頑張って書きました heap構造も使ってるのでそっちも更新せねば
モジュール変数で要素を管理してるモジュールと
ラップしてモジュール変数決め打ちモジュールの二つを記述しています
0.1.2.1 setter と getter のラップ増やしました
#module stack_model
について
後入れ先出し構造のstackのデータ型の
データを扱うモジュールです
モジュール変数メンバ
stack_size
stackのデータのsizeです
int型
stack_current
stackの中の現在地を示す変数です
int型
stack_contents
stack型データを格納する
モジュール変数の配列データです
データ一つは mdl_one_value 型のオブジェクトです
コンストラクタ
引数:int p_size
stack_sizeとstack_curerentにp_sizeを代入し
p_sizeの値だけmdl_one_value型の
stack_contentsを作成します
#modfunc local set_current
引数:int p_int
stack_currentのsetterです。
p_intの値を代入
#modfunc local set_contents
引数1:var p_value
引数2:int p_index
stack_contentsのsetterです。
p_indexの場所にp_valueを代入
#modcfunc local get_size
stack_sizeのgetter
local get_contents
引数:int p_index
stack_contentsのgetterです
p_indexの場所の値を返す
#modcfunc local get_current
stackの現在値のgetter
#modcfunc local get_contents
引数: int p_index
stackのp_index番目の値を返す
#modcfunc local ret_vartype
引数:int p_index
stack_contentsのp_index番目の値の型を
数値で返す
#modcfunc local tostr_vartype
引数:int p_index
stack_contentsのp_index番目の値の型を
文字列で返す
#modfunc local push
引数:var _p_val
stackのデータに_p_valの値をpushする
#modcfunc local pop
stackのデータをpopします
値は返り値として返します
#modcfunc local top
stackのデータを取得します。currentは変化しません
値は返り値として返します
#modcfunc local peak
stackをpeakします
値は返り値として返します
#modfunc local cleanup
stack型のデータを削除します
newmod stack,stack_model,STACK_MEMBERS@
このモジュールでは何種類のstack型データを共存させる
モジュールと(ここより上の動作)
決め打ちで1つのみ作成するモジュールを定義しています
1つのみのデータはオブジェクトを指定しなくていいので
少しは直感的に操作出来ると思います
// 後入れ先出し構造のstackのデータ型の // データを扱うモジュールです #include "mdl_value.as" #include "mdl_value.as" //includeガードが効いてるかのTEST #include "mdl_ws_define.as" #include "mdl_ws_define.as" //includeガードが効いてるかのTEST // long size; // long current; // long long* contents; //} stack; // モジュール変数メンバ // stack_size // stackのデータのsizeです // int型 // stack_current // stackの中の現在地を示す変数です // int型 // stack_contents // stack型データを格納する // モジュール変数の配列データです // データ一つは mdl_one_value 型のオブジェクトです #module stack_model stack_size,stack_current,stack_contents // コンストラクタ // 引数:int p_size // stack_sizeとstack_curerentにp_sizeを代入し // p_sizeの値だけmdl_one_value型の // stack_contentsを作成します #modinit int p_size stack_size = p_size stack_current = p_size repeat p_size newmod stack_contents,mdl_one_value loop ; dim stack_contents,STACK_MEMBERS@ return ;#modfunc local set_size int p_int ; stack_size = p_int ; return // stack_currentのsetterです。 // p_intの値を代入 #modfunc local set_current int p_int stack_current = p_int return // stack_contentsのsetterです。 // p_indexの場所にp_valueを代入 #modfunc local set_contents var p_value,int p_index set@mdl_one_value stack_contents.p_index,p_value // stack_contents.p_index = p_value return // stack_contentsのgetterです // p_indexの場所の値を返す #modcfunc local get_size return stack_size // stackの現在値のgetter #modcfunc local get_current return stack_current // stackのp_index番目の値を返す #modcfunc local get_contents int p_index tmp_index=STACK_MEMBERS@ if p_index >=STACK_MEMBERS@{tmp_index=STACK_MEMBERS@-1} ; logmes ""+STACK_MEMBERS@+" "+p_index ; return stack_contents.p_index return get@mdl_one_value(stack_contents.p_index) // stack_contentsのp_index番目の値の型を // 数値で返す #modcfunc local ret_vartype int p_index return ret_vartype@mdl_one_value(stack_contents.p_index) ; return tmp;@mdl_one_value(stack_contents.0) // stack_contentsのp_index番目の値の型を // 文字列で返す #modcfunc local tostr_vartype int p_index return tostr_vartype@mdl_one_value(stack_contents.p_index) ; return tmp;@mdl_one_value(stack_contents.0) //bool stack_push(long long val) //{ // if (stack.current >= 1) { // stack.current--; // stack.contents[stack.current] = val; // return true; // } // return false; //} // stackのデータに_p_valの値をpushする #modfunc local push var _p_val if stack_current >= 1{ stack_current-- set@mdl_one_value stack_contents.stack_current,_p_val return 1 } return 0 //long long stack_pop(void) //{ // if (stack.current < stack.size) { // stack.current++; // return stack.contents[stack.current - 1]; // } // return 0; //} // stackのデータをpopします // 値は返り値として返します #modcfunc local pop local loc_pop if stack_current < stack_size { stack_current++ loc_pop=stack_current-1 return get@mdl_one_value(stack_contents.loc_pop) } return 0 // stackのデータを取得します。currentは変化しません // 値は返り値として返します #modcfunc local top if stack_current < stack_size { return get@mdl_one_value(stack_contents.stack_current) } return 0 //long long stack_peak(int depth) //{ // if ((stack.current + depth) < stack.size) { // return stack.contents[stack.current + depth]; // } // return 0; //} // stackをpeakします // 値は返り値として返します #modcfunc local peak int p_depth, local loc_depth if stack_current + p_depth < stack_size { loc_depth=stack_current + p_depth return get@mdl_one_value(stack_contents.loc_depth) } return 0 //void cleanup_stack(void) //{ // free (stack.contents); // return; //} // stack型のデータを削除します #modfunc local cleanup i=0 for i,stack_size-1,-1,-1 delmod stack_contents.i next return #global // このモジュールでは何種類のstack型データを共存させる // モジュールと(ここより上の動作) // 決め打ちで1つのみ作成するモジュールを定義しています // 1つのみのデータはオブジェクトを指定しなくていいので // 少しは直感的に操作出来ると思います //↓重要w newmod stack,stack_model,STACK_MEMBERS@ #if 1 ;set_size@stack_model stack,20 set_current@stack_model stack,5 repeat 5 nn=cnt*2 set_contents@stack_model stack,nn,cnt loop repeat 5,5 nn=12.3+cnt set_contents@stack_model stack,nn,cnt loop repeat 5,10 nn="abc"+cnt set_contents@stack_model stack,nn,cnt loop logmes "stack size:"+get_size@stack_model(stack) logmes "stack current:"+get_current@stack_model(stack) repeat 15 logmes "stack contents "+cnt+":"+get_contents@stack_model(stack,cnt) logmes "type "+cnt+":"+ret_vartype@stack_model(stack,cnt)+" "+tostr_vartype@stack_model(stack,cnt) loop newmod test_st,stack_model,20 tmp_test=555 push@stack_model test_st,tmp_test tmp_test=777 push@stack_model test_st,tmp_test tmp_test=5 push@stack_model test_st,tmp_test tmp_test=12.3 push@stack_model test_st,tmp_test tmp_test="abc" push@stack_model test_st,tmp_test tmp_test=246 push@stack_model test_st,tmp_test logmes "top:"+top@stack_model(test_st) logmes "peak 1:"+peak@stack_model(test_st,1) logmes "peak 2:"+peak@stack_model(test_st,2) logmes "pop:"+pop@stack_model(test_st) logmes "pop:"+pop@stack_model(test_st) logmes "top:"+top@stack_model(test_st) logmes "pop:"+pop@stack_model(test_st) logmes "pop:"+pop@stack_model(test_st) #endif #if 0 cleanup@stack_model(test_st) delmod test_st #endif // つづく
#deffunc create_stack
stackのデータを初期化
#deffunc stack_set_current
引数:int _p_int
stackの現在値を_p_intにする
#defcfunc stack_get_size
stackのsizeを返す
#defcfunc stack_get_current
stackの現在値を返す
#defcfunc stack_ret_vartype
引数:int _p_int
stackの_p_int番目の値の型を返す(数値)
#defcfunc stack_tostr_vartype
引数:int _p_int
stackの_p_int番目の値の型を返す(文字列)
#defcfunc stack_push
引数: var p_val
stackにp_valの値をpushする
#defcfunc stack_pop
stackからpopする(返り値として返す)
#defcfunc stack_top
stackのtopの値を返す
#defcfunc stack_peak
引数:int _p_peak
stackからpeakする
#deffunc stack_cleanup
stackを破棄する
// つづきここから /* bool create_stack(void) { if (stack.contents = (long long*)calloc(STACK_MEMBERS, sizeof(long long))) { stack.size = STACK_MEMBERS; stack.current = STACK_MEMBERS; return true; } return false; }*/ #module //stackのデータを初期化 #deffunc create_stack // stackのsizeは途中から変えれなくなったw repeat STACK_MEMBERS set_contents@stack_model stack@,0,cnt loop ; set_size@stack_model stack@,STACK_MEMBERS@ set_current@stack_model stack@,STACK_MEMBERS@ return 1 //stackの現在値を_p_intにする #deffunc stack_set_current int _p_int set_current@stack_model stack@,_p_int return //stackのsizeを返す #defcfunc stack_get_size return get_size@stack_model(stack@) //stackの現在値を返す #defcfunc stack_get_current return get_current@stack_model(stack@) //stackの_p_int番目の値の型を返す(数値) #defcfunc stack_ret_vartype int _p_int return ret_vartype@stack_model(stack@,_p_int) //stackの_p_int番目の値の型を返す(文字列) #defcfunc stack_tostr_vartype int _p_int return tostr_vartype@stack_model(stack@,_p_int) //stackにp_valの値をpushする #defcfunc stack_push var p_val,local loc_spush loc_spush=p_val push@stack_model stack@,loc_spush return stat //stackからpopする(返り値として返す) #defcfunc stack_pop return pop@stack_model(stack@) //stackのtopの値を返す #defcfunc stack_top return top@stack_model(stack@) //stackからpeakする #defcfunc stack_peak int _p_peak return peak@stack_model(stack@,_p_peak) //stackを破棄する #deffunc stack_cleanup cleanup@stack_model(stack@) delmod stack@ return #global #if 1 create_stack logmes "size "+stack_get_size() tmp4log=10 logmes "push "+stack_push(tmp4log)+" "+tmp4log tmp4log=23.4 logmes "push "+stack_push(tmp4log)+" "+tmp4log tmp4log=30 logmes "push "+stack_push(tmp4log)+" "+tmp4log tmp4log="abc" logmes "push "+stack_push(tmp4log)+" "+tmp4log tmp4log=20 logmes "push "+stack_push(tmp4log)+" "+tmp4log tmp4log=34.5 logmes "push "+stack_push(tmp4log)+" "+tmp4log tmp_cur=stack_get_current() logmes "cur "+tmp_cur logmes "type "+stack_ret_vartype(tmp_cur) logmes "type "+stack_tostr_vartype(tmp_cur) logmes "type "+stack_ret_vartype(tmp_cur-1) logmes "type "+stack_tostr_vartype(tmp_cur-1) logmes "top "+stack_top() tmp4log=40 logmes "push "+stack_push(tmp4log)+" "+tmp4log tmp4log="top" logmes "push "+stack_push(tmp4log)+" "+tmp4log logmes "top "+stack_top() logmes "peak 1 "+stack_peak(1) logmes "peak 2 "+stack_peak(2) logmes "pop "+stack_pop() logmes "pop "+stack_pop() logmes "top "+stack_top() logmes "peak 1 "+stack_peak(1) logmes "pop "+stack_pop() logmes "pop "+stack_pop() logmes "cur "+stack_get_current() stack_set_current 700 logmes "cur "+stack_get_current() tmp4log=12.3456 logmes "push "+stack_push(tmp4log)+" "+tmp4log #endif #if 0 stack_cleanup #endif