white_spaceでheap構造をデータ型の一つにしてるので
頑張って書きました
モジュール変数で要素を管理してるモジュールと
ラップしてモジュール変数決め打ちモジュールの二つを記述しています
stackとheapのスクリプト大体出来たから やっと次に進めそうっすw
#ifndef _mdl_value_H_ #define _mdl_value_H_ #module mdl_one_value mem_value #modinit return #modfunc local set var p mem_value=p return #modcfunc local get return mem_value #modcfunc local ret_vartype return vartype(mem_value) #modcfunc local tostr_vartype switch vartype(mem_value) case 1:return "label" case 2:return "str" case 3:return "dbl" case 4:return "int" case 5:return "modvar" swend return "other" #global #endif #if 0 newmod test_o_int,mdl_one_value newmod test_o_dbl,mdl_one_value newmod test_o_str,mdl_one_value a=1 set@mdl_one_value test_o_int,a b=1.23 set@mdl_one_value test_o_dbl,b c="HELLO" set@mdl_one_value test_o_str,c mes get@mdl_one_value(test_o_int) mes get@mdl_one_value(test_o_dbl) mes get@mdl_one_value(test_o_str) mes ret_vartype@mdl_one_value(test_o_int) mes ret_vartype@mdl_one_value(test_o_dbl) mes ret_vartype@mdl_one_value(test_o_str) mes tostr_vartype@mdl_one_value(test_o_int) mes tostr_vartype@mdl_one_value(test_o_dbl) mes tostr_vartype@mdl_one_value(test_o_str) #endif
#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 //struct heap_model { // long long* address; // long long* value; // long elements; //} heap; #module heap_model heap_size,heap_address,heap_value,heap_elements #modinit int p_size heap_size = p_size repeat p_size newmod heap_address,mdl_one_value newmod heap_value,mdl_one_value 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@mdl_one_value heap_address.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@mdl_one_value heap_value.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@mdl_one_value(heap_address.p_index) #modcfunc local get_value int p_index if p_index < 0:return -1 if p_index >= heap_size:return -1 return get@mdl_one_value(heap_value.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@mdl_one_value(heap_address.i) if loc_ad == _p_addr { set@mdl_one_value heap_address.i,_p_addr set@mdl_one_value heap_value.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@mdl_one_value heap_address.i,loc_ad_b set@mdl_one_value heap_value.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@mdl_one_value(heap_address.i) if loc_ad == _p_addr{ return get@mdl_one_value(heap_value.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@mdl_one_value(heap_value.p_index) #modcfunc local tostr_vartype_value int p_index return tostr_vartype@mdl_one_value(heap_value.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) #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,local loc_size 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