white_space
white_space企画の現状 heapモジュール ver0.1.1 †
#ifndef _MY_WS_DEFINE_
#define _MY_WS_DEFINE_
// 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