#author("2018-06-16T22:55:24+09:00","","") #author("2018-06-19T19:47:33+09:00","","") *white_space企画の現状 heapモジュール ver 0.1.2.5 [#e8f82fed] white_spaceでheap構造をデータ型の一つにしてるので 頑張って書きました モジュール変数で要素を管理してるモジュールと ラップしてモジュール変数決め打ちモジュールの二つを記述しています stackとheapのスクリプト大体出来たから やっと次に進めそうっすw *サブルーチン [#kce4e8c2] [[ws_014_subr]] *ws_bar_heap_014_submdl.hsp:サブモジュール [#w844a0a6] heapの二つの要素を格納するサブモジュール~ 別々に格納するよりデバッガで確認しやすい~ heap_youso_address:heapのindexを格納するモジュール変数~ 数値を格納する~ heap_youso_value:heapの値を格納するモジュール変数~ mdl_one_value型なので数値、実数、文字列等格納できる~ #modinit~ コンスタラクタ。引数なし~ #modfunc local set_address~ 引数:int __p_int~ heap_youso_addressのsetter~ #modfunc local set_value~ 引数:var __p_value~ heap_youso_valueのsetter~ #modcfunc local get_address~ heap_youso_addressのgetter~ #modcfunc local get_value~ heap_youso_valueのgetter~ #modcfunc local ret_vartype_value~ heap_youso_valueの型を返す(数値)~ #modcfunc local tostr_vartype_value~ heap_youso_valueの型を返す(文字列)~ #include "mdl_value.as" #include "mdl_value.as" //includeガードが効いてるかのTEST #include "mdl_ws_define.as" #include "mdl_ws_define.as" //includeガードが効いてるかのTEST //struct heap_model { // long long* address; // long long* value; // long elements; //} heap; //heapの二つの要素を格納するサブモジュール //別々に格納するよりデバッガで確認しやすい //heap_youso_address:heapのindexを格納するモジュール変数 //数値を格納する //heap_youso_value:heapの値を格納するモジュール変数 //mdl_one_value型なので数値、実数、文字列等格納できる #module heap_2youso heap_youso_address,heap_youso_value //コンスタラクタ。引数なし #modinit heap_youso_address=-1 newmod heap_youso_value,mdl_one_value return //heap_youso_addressのsetter #modfunc local set_address int __p_int heap_youso_address=__p_int return 1 //heap_youso_valueのsetter #modfunc local set_value var __p_value,local loc_tmp_value loc_tmp_value=__p_value set@mdl_one_value heap_youso_value,loc_tmp_value return 1 //heap_youso_addressのgetter #modcfunc local get_address return heap_youso_address //heap_youso_valueのgetter #modcfunc local get_value return get@mdl_one_value(heap_youso_value) //heap_youso_valueの型を返す(数値) #modcfunc local ret_vartype_value return ret_vartype@mdl_one_value(heap_youso_value) //heap_youso_valueの型を返す(文字列) #modcfunc local tostr_vartype_value return tostr_vartype@mdl_one_value(heap_youso_value) #global //そういえばこのモジュールテストしてないっすw *サブな本体 [#v5f228f7] #include "mdl_value.as" #include "mdl_value.as" //includeガードが効いてるかのTEST #ifndef _MY_WS_DEFINE_ #define _MY_WS_DEFINE_ // knowbugが配列インスタンスを800くらいまでしか表示してくれないため #define STACK_MEMBERS 750 #define HEAP_MEMBERS 400 #define MAX_LABELS 200 #define MAX_LABEL_LENGTH 500 #define MAX_INSTRUCTIONS 24 #define MAX_INSTRUCTION_LENGTH 5 #define MAX_NESTED_SUBROUTINES 20 #endif #include "mdl_ws_define.as" #include "mdl_ws_define.as" //includeガードが効いてるかのTEST #include "ws_bar_heap_014_submdl.hsp" #include "ws_bar_heap_014_submdl.hsp" //includeガードが効いてるかのTEST //struct heap_model { // long long* address; // long long* value; // long elements; //} heap; #module heap_2youso heap_youso_address,heap_youso_value #modinit heap_youso_address=-1 newmod heap_youso_value,mdl_one_value return #modfunc local set_address int __p_int heap_youso_address=__p_int return 1 #modfunc local set_value var __p_value,local loc_tmp_value loc_tmp_value=__p_value set@mdl_one_value heap_youso_value,loc_tmp_value return 1 #modcfunc local get_address return heap_youso_address #modcfunc local get_value int p_index return get@mdl_one_value(heap_youso_value) #modcfunc local ret_vartype_value return ret_vartype@mdl_one_value(heap_youso_value) #modcfunc local tostr_vartype_value return tostr_vartype@mdl_one_value(heap_youso_value) #global ////////////////////////////////////////////////////////////////////// #module heap_model heap_youso,heap_size,heap_address,heap_value,heap_elements #modinit int p_size heap_size = p_size repeat p_size newmod heap_youso,heap_2youso loop heap_elements=0 return #modcfunc local get_size return heap_size #modfunc local set_address var p_value,int p_index if p_index < 0:return -1 if p_index >= heap_size:return -1 set_address@heap_2youso heap_youso.p_index,p_value return 1 #modfunc local set_value var p_value,int p_index if p_index < 0:return -1 if p_index >= heap_size:return -1 set_value@heap_2youso heap_youso.p_index,p_value return 1 #modfunc local set_elements int p_int heap_elements = p_int return #modcfunc local get_address int p_index if p_index < 0:return -1 if p_index >= heap_size:return -1 return get_address@heap_2youso(heap_youso.p_index) #modcfunc local get_value int p_index if p_index < 0:return -1 if p_index >= heap_size:return -1 return get_value@heap_2youso(heap_youso.p_index) #modcfunc local get_elements return heap_elements //bool heap_put(long long val, long long addr) //{ // // First see if the address is already in use // for (int i = 0; i < heap.elements; i++) { // if (heap.address[i] == addr) { // heap.value[i] = val; // return true; // } // // If not, then it needs to be added if there is room left // if (heap.elements < HEAP_MEMBERS) { // int i = heap.elements; // heap.address[i] = addr; // heap.value[i] = val; // heap.elements++; // return true; // } // return false; //} #modfunc local put var _p_val,int _p_addr,local loc_e,local loc_e2,local loc_ad,local loc_ad_b // First see if the address is already in use loc_e=heap_elements for i,0,loc_e,1 loc_ad=get_address@heap_2youso(heap_youso.i) if loc_ad == _p_addr { set_address@heap_2youso heap_youso.i,_p_addr set_value@heap_2youso heap_youso.i,_p_val return 1 } next // If not, then it needs to be added if there is room left if loc_e < heap_size { i = loc_e loc_ad_b=_p_addr set_address@heap_2youso heap_youso.i,loc_ad_b set_value@heap_2youso heap_youso.i,_p_val loc_e2 = heap_elements loc_e2++ heap_elements=loc_e2 return 1 } return 0 // Trying to get data from an address that doesn't exist results in 0 being returned //long long heap_get(long long addr) //{ // for (int i = 0; i < HEAP_MEMBERS; i++) { // if (heap.address[i] == addr) return heap.value[i]; // } // return 0; //} #modcfunc local get_youso int _p_addr,local loc_ad for i,0,heap_size,1 loc_ad=get_address@heap_2youso(heap_youso.i) if loc_ad == _p_addr{ return get_value@heap_2youso(heap_youso.i) } next return 0 ;#modcfunc local ret_vartype_address int p_index ; if p_index < 0:return -1 ; if p_index >= heap_size:return -1 ; return ret_vartype@mdl_one_value(heap_address.p_index) ;#modcfunc local tostr_vartype_address int p_index ; return tostr_vartype@mdl_one_value(heap_address.p_index) #modcfunc local ret_vartype_value int p_index if p_index < 0:return -1 if p_index >= heap_size:return -1 return ret_vartype_value@heap_2youso(heap_youso.p_index) #modcfunc local tostr_vartype_value int p_index return tostr_vartype_value@heap_2youso(heap_youso.p_index) #modfunc local cleanup i=0 for i,heap_size-1,-1,-1 delmod heap_address.i delmod heap_value.i next return #global //↓重要w newmod heap,heap_model,HEAP_MEMBERS@ #if 1 repeat 5 tmp=cnt*3 set_address@heap_model heap,tmp,cnt tmp=cnt*4 set_value@heap_model heap,tmp,cnt loop set_elements@heap_model heap,7 repeat 10 logmes "heap address "+cnt+":"+get_address@heap_model(heap,cnt) loop repeat 10 logmes "heap value "+cnt+":"+get_value@heap_model(heap,cnt) loop logmes "heap elements:"+get_elements@heap_model(heap) repeat 10 logmes "heap type "+ret_vartype_value@heap_model(heap,cnt) logmes "heap type "+tostr_vartype_value@heap_model(heap,cnt) loop #endif //bool create_heap(void) //{ // if (heap.address = (long long*)calloc(HEAP_MEMBERS, sizeof(long long))) { // if (heap.value = (long long*)calloc(HEAP_MEMBERS, sizeof(long long))) { // heap.elements = 0; // return true; // } // free (heap.address); // } // return false; //} #module #deffunc create_heap local loc_tmp // stackのsizeは途中から変えれなくなったw loc_tmp=0 repeat HEAP_MEMBERS set_address@heap_model heap@,loc_tmp,cnt set_value@heap_model heap@,loc_tmp,cnt loop set_elements@heap_model heap@,0 return 1 #deffunc heap_set_elements int _p_int set_elements@heap_model heap@,_p_int return #defcfunc heap_get_elements return set_elements@heap_model(heap@) #defcfunc heap_get_size int _p_int get_size@heap_model(heap@) return #deffunc heap_put var p_val,int p_addr put@heap_model heap@,p_val,p_addr return stat #defcfunc heap_get int p_addr return get_youso@heap_model(heap@,p_addr) ;#defcfunc heap_ret_vartype_address int _p_int ; return ret_vartype_address@heap_model(heap@,_p_int) ;#defcfunc heap_tostr_vartype_address int _p_int ; return tostr_vartype_address@heap_model(heap@,_p_int) #defcfunc heap_ret_vartype_value int _p_int return ret_vartype_value@heap_model(heap@,_p_int) #defcfunc heap_tostr_vartype_value int _p_int return tostr_vartype_value@heap_model(heap@,_p_int) #deffunc heap_cleanup cleanup@heap_model(heap@) delmod heap@ return #global #if 1 create_heap baz=10.23 put@heap_model heap@,baz,1 baz=123.456 put@heap_model heap@,baz,2 baz="abcde" put@heap_model heap@,baz,3 foo=30 heap_put foo,4 foo=345.678 heap_put foo,5 foo="fghij" heap_put foo,6 foo=1 logmes "heap get "+get_youso@heap_model(heap@,foo) foo=2 logmes "heap get "+get_youso@heap_model(heap@,foo) foo=3 logmes "heap get "+get_youso@heap_model(heap@,foo) foo=4 logmes "heap get "+heap_get(foo) foo=5 logmes "heap get "+heap_get(foo) foo=6 logmes "heap get "+heap_get(foo) foo=1 logmes "heap type "+heap_ret_vartype_value(foo) logmes "heap type "+heap_tostr_vartype_value(foo) ;logmes "heap type "+heap_ret_vartype_address(foo) ;logmes "heap type "+heap_tostr_vartype_address(foo) logmes "heap type "+tostr_vartype_value@heap_model(heap@,foo) logmes "heap type "+ret_vartype_value@heap_model(heap@,foo) ;logmes "heap type "+tostr_vartype_address@heap_model(heap@,foo) ;logmes "heap type "+ret_vartype_address@heap_model(heap@,foo) #endif #if 0 heap_cleanup #endif