white_space企画の現状 heapモジュール ver 0.1.2.1

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