#author("2018-06-16T22:55:24+09:00","","")
#author("2018-06-19T19:47:33+09:00","","")
*white_space企画の現状 heapモジュール ver 0.1.2.5 [#e8f82fed]
white_spaceでheap構造をデータ型の一つにしてるので

頑張って書きました

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

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

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

*サブルーチン [#kce4e8c2]
[[ws_014_subr]]

*ws_bar_heap_014_submdl.hsp:サブモジュール [#w844a0a6]

heapの二つの要素を格納するサブモジュール~
別々に格納するよりデバッガで確認しやすい~
heap_youso_address:heapのindexを格納するモジュール変数~
数値を格納する~
heap_youso_value:heapの値を格納するモジュール変数~
mdl_one_value型なので数値、実数、文字列等格納できる~

#modinit~
コンスタラクタ。引数なし~

#modfunc local set_address~
引数:int __p_int~
heap_youso_addressのsetter~

#modfunc local set_value~
引数:var __p_value~
heap_youso_valueのsetter~

#modcfunc local get_address~
heap_youso_addressのgetter~

#modcfunc local get_value~
heap_youso_valueのgetter~

#modcfunc local ret_vartype_value~
heap_youso_valueの型を返す(数値)~

#modcfunc local tostr_vartype_value~
heap_youso_valueの型を返す(文字列)~
 #include "mdl_value.as"
 #include "mdl_value.as" //includeガードが効いてるかのTEST
 #include "mdl_ws_define.as"
 #include "mdl_ws_define.as" //includeガードが効いてるかのTEST
 
 //struct heap_model {
 //	long long* address;
 //	long long* value;
 //	long elements;
 //} heap;
 //heapの二つの要素を格納するサブモジュール
 //別々に格納するよりデバッガで確認しやすい
 //heap_youso_address:heapのindexを格納するモジュール変数
 //数値を格納する
 //heap_youso_value:heapの値を格納するモジュール変数
 //mdl_one_value型なので数値、実数、文字列等格納できる
 #module heap_2youso heap_youso_address,heap_youso_value
 //コンスタラクタ。引数なし
 #modinit
 	heap_youso_address=-1
 	newmod heap_youso_value,mdl_one_value
 	return
 //heap_youso_addressのsetter
 #modfunc local set_address int __p_int
 	heap_youso_address=__p_int
 	return 1
 //heap_youso_valueのsetter
 #modfunc local set_value var __p_value,local loc_tmp_value
 	loc_tmp_value=__p_value
 	set@mdl_one_value heap_youso_value,loc_tmp_value
 	return 1
 //heap_youso_addressのgetter
 #modcfunc local get_address
 	return heap_youso_address
 //heap_youso_valueのgetter
 #modcfunc local get_value
 	return get@mdl_one_value(heap_youso_value)
 //heap_youso_valueの型を返す(数値)
 #modcfunc local ret_vartype_value
 	return ret_vartype@mdl_one_value(heap_youso_value)
 //heap_youso_valueの型を返す(文字列)
 #modcfunc local tostr_vartype_value
 	return tostr_vartype@mdl_one_value(heap_youso_value)
 #global
 //そういえばこのモジュールテストしてないっすw

*サブな本体 [#v5f228f7]
 #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
 #include "mdl_ws_define.as"
 #include "mdl_ws_define.as" //includeガードが効いてるかのTEST
 #include "ws_bar_heap_014_submdl.hsp"
 #include "ws_bar_heap_014_submdl.hsp" //includeガードが効いてるかのTEST
 
 //struct heap_model {
 //	long long* address;
 //	long long* value;
 //	long elements;
 //} heap;
 #module heap_2youso heap_youso_address,heap_youso_value
 #modinit
 	heap_youso_address=-1
 	newmod heap_youso_value,mdl_one_value
 	return
 #modfunc local set_address int __p_int
 	heap_youso_address=__p_int
 	return 1
 #modfunc local set_value var __p_value,local loc_tmp_value
 	loc_tmp_value=__p_value
 	set@mdl_one_value heap_youso_value,loc_tmp_value
 	return 1
 #modcfunc local get_address
 	return heap_youso_address
 #modcfunc local get_value int p_index
 	return get@mdl_one_value(heap_youso_value)
 #modcfunc local ret_vartype_value
 	return ret_vartype@mdl_one_value(heap_youso_value)
 #modcfunc local tostr_vartype_value
 	return tostr_vartype@mdl_one_value(heap_youso_value)
 #global
 //////////////////////////////////////////////////////////////////////
 
 
 #module heap_model heap_youso,heap_size,heap_address,heap_value,heap_elements
 #modinit int p_size
 	heap_size = p_size
 	repeat p_size
 		newmod heap_youso,heap_2youso
 	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_address@heap_2youso heap_youso.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_value@heap_2youso heap_youso.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_address@heap_2youso(heap_youso.p_index)
 #modcfunc local get_value int p_index
 	if p_index < 0:return -1
 	if p_index >= heap_size:return -1
 	return get_value@heap_2youso(heap_youso.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_address@heap_2youso(heap_youso.i)
 		if loc_ad == _p_addr {
 			set_address@heap_2youso heap_youso.i,_p_addr
 			set_value@heap_2youso heap_youso.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_address@heap_2youso heap_youso.i,loc_ad_b
 			set_value@heap_2youso heap_youso.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_address@heap_2youso(heap_youso.i)
 		if loc_ad == _p_addr{
 			return get_value@heap_2youso(heap_youso.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_value@heap_2youso(heap_youso.p_index)
 #modcfunc local tostr_vartype_value int p_index
 	return tostr_vartype_value@heap_2youso(heap_youso.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)
 repeat 10
 logmes "heap type "+ret_vartype_value@heap_model(heap,cnt)
 logmes "heap type "+tostr_vartype_value@heap_model(heap,cnt)
 loop
 #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
 	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