#author("2018-01-20T07:05:24+09:00","","") #author("2018-02-01T14:53:58+09:00","","") [[white_space]] *white_space企画の現状 heapモジュール ver0.1.1[#q2392f6f] #ifndef _MY_WS_DEFINE_ #define _MY_WS_DEFINE_ #define STACK_MEMBERS 1024 #define HEAP_MEMBERS 1024 // knowbugが配列インスタンスを800くらいまでしか表示してくれないため #define STACK_MEMBERS 750 #define HEAP_MEMBERS 750 #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_address,heap_value,heap_elements #modinit dim heap_address,HEAP_MEMBERS@ dim heap_value,HEAP_MEMBERS@ heap_elements=0 return #modfunc local set_address int p_value,int p_index heap_address.p_index = p_value return #modfunc local set_value int p_value,int p_index heap_value.p_index = p_value return #modfunc local set_elements int p_int heap_elements = p_int return #modcfunc local get_address int p_index return heap_address.p_index #modcfunc local get_value int p_index return heap_value.p_index #modcfunc local get_elements return heap_elements #global newmod heap,heap_model #if 1 repeat 5 set_address@heap_model heap,cnt*3,cnt set_value@heap_model heap,cnt*4,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 repeat HEAP_MEMBERS set_address@heap_model heap@,0,cnt set_value@heap_model heap@,0,cnt loop return 1 #global #if 1 create_heap #endif //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; // } #module #deffunc heap_put int p_val,int p_addr,local tmp_e,local tmp_e2,local tmp_ad // First see if the address is already in use tmp_e=get_elements@heap_model(heap@) for i,0,tmp_e,1 tmp_ad=get_address@heap_model(heap@,i) if tmp_ad == p_addr { set_value@heap_model heap@,p_val,i return 1 } next // If not, then it needs to be added if there is room left if tmp_e < HEAP_MEMBERS@ { i = tmp_e set_address@heap_model heap@,p_addr,i set_value@heap_model heap@,p_val,i tmp_e2 = get_elements@heap_model(heap@) tmp_e2++ set_elements@heap_model heap@,tmp_e2 return 1 } return 0 #global #if 1 heap_put 10,1 heap_put 20,2 heap_put 30,3 #endif // 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; //} #module #defcfunc heap_get int addr,local tmp_ad for i,0,HEAP_MEMBERS@,1 tmp_ad=get_address@heap_model(heap@,i) if tmp_ad == addr{ return get_value@heap_model(heap@,i) } next return 0 #global #if 1 heap_put 10,1 heap_put 20,2 heap_put 30,3 logmes "heap get "+heap_get(1) logmes "heap get "+heap_get(2) logmes "heap get "+heap_get(3) #endif //void cleanup_heap(void) //{ // free (heap.address); // free (heap.value); // return; //} // heapは配列表現にしてあるので何もしなくてもたぶんOKw #module #deffunc cleanup_heap return #global #if 1 cleanup_heap #endif