#author("2018-02-12T19:33:22+09:00","","")
*white_space企画の現状 heapモジュール ver 0.1.2 [#h718165f]
#author("2018-02-12T19:35:22+09:00","","")
*white_space企画の現状 heapモジュール ver 0.1.2.1 [#h718165f]

white_spaceでheap構造をデータ型の一つにしてるので

頑張って書きました

モジュール変数で要素を管理してるモジュールと

ラップしてモジュール変数決め打ちモジュールの二つを記述しています

stackとheapのスクリプト大体出来たから やっと次に進めそうっすw

**サブルーチン [#ya117b7b]

 #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

**サブな本体 [#v426454a]

 #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