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