white_spaceでheap構造をデータ型の一つにしてるので
頑張って書きました
モジュール変数で要素を管理してるモジュールと
ラップしてモジュール変数決め打ちモジュールの二つを記述しています
stackとheapのスクリプト大体出来たから やっと次に進めそうっすw
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
#include "mdl_value.as" #include "mdl_value.as" //includeガードが効いてるかのTEST #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 #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