Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > Blitz3D > Полезные функции

Полезные функции Выкладываем полезные функции, чтоб не изобретать велосипед заново...

Ответ
 
Опции темы
Старый 06.04.2013, 22:21   #1
Nerd
Чудо-кот
 
Аватар для Nerd
 
Регистрация: 22.02.2011
Сообщений: 901
Написано 480 полезных сообщений
(для 1,471 пользователей)
Stack и Map

Хранят строки.
;;;;;;;;;;;;;;;;;;;;;;;; DATA STRUCTURES ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;-------------- MAP data type ---------------------------------------------------

Type TMap
	Field members ;bank with handles of records
	Field pntr ;bank pointer (-4 - empty)
	Field rel_size ;size of bank realloc
End Type

	Type TMap_r ;map record
		Field name$,dat$
	End Type


Function CreateMap.TMap(rs=64)
	map.TMap = New TMap
		map\members = CreateBank(rs)
		map\rel_size = rs
		map\pntr = -4
	Return map
End Function


	Function TMap_Insert(map.TMap,name$,dat$)
		Local r.TMap_r
		If (map\pntr<>-4)
			For i = 0 To pntr Step 4
				r = Object.TMap_r(PeekInt(map\members,i))
				If r\name = name Then
					r\dat = dat
					Return
				EndIf
			Next
		EndIf
			r = New TMap_r
			r\name = name
			r\dat = dat
				If (map\pntr+8)>BankSize(map\members) Then
					ResizeBank(map\members,map\pntr+map\rel_size)
				EndIf
			map\pntr = map\pntr + 4
			PokeInt(map\members,map\pntr,Handle(r))
	End Function
	
	
Function TMap_Get$(map.TMap,name$)
		Local r.TMap_r
	If (map\pntr<>-4)
		For i = 0 To map\pntr Step 4
			r = Object.TMap_r(PeekInt(map\members,i))
		
			If r\name = name Then
				Return r\dat
			EndIf
		Next
	EndIf
End Function

	Function TMap_Remove(map.TMap,name$) ;remove record
			Local r.TMap_r
			Local moveback
		If (map\pntr<>-4)
			For i = 0 To map\pntr Step 4
				If moveback Then
					PokeInt(map\members,map\pntr, PeekInt(map\members,map\pntr+4) )
					
				Else
					r = Object.TMap_r(PeekInt(map\members,i))
						If r\name = name Then
							Delete r
							map\pntr = map\pntr - 4
							moveback = 1
							i = i - 4
						EndIf
				EndIf
			Next
		EndIf
	End Function

	Function TMap_Delete(map.TMap)
			Local r.TMap_r
		If (map\pntr<>-4)
			For i = 0 To map\pntr Step 4
				r = Object.TMap_r(PeekInt(map\members,i))
				Delete r
			Next
		EndIf
			FreeBank map\members
		Delete map
	End Function
	
	
	
;------------------ STACK data type ---------------------------------------------------

Type TStack
	Field members
	Field pntr
	Field rel_size
End Type

	Type TStack_r
		Field dat$
	End Type


Function CreateStack.TStack(rs=64)
	st.TStack = New TStack
		st\members = CreateBank(rs)
		st\rel_size = rs
		st\pntr = -4
	Return st
End Function


	Function TStack_Push(st.TStack,dat$)
		Local r.TStack_r
			r = New TStack_r
			r\dat = dat
				If (st\pntr+8)>BankSize(st\members) Then
					ResizeBank(st\members,st\pntr+st\rel_size)
				EndIf
			st\pntr = st\pntr + 4
			PokeInt(st\members,st\pntr,Handle(r))
	End Function
	
	
	Function TStack_Pop$(st.TStack)
			Local r.TStack_r,res$
		If (st\pntr<>-4)
			r = Object.TStack_r(PeekInt(st\members,st\pntr))
				res = r\dat
			Delete r
			st\pntr = st\pntr - 4
				Return res
		EndIf
	End Function
 
		Function TStack_GetLast$(st.TStack)
				Local r.TStack_r
			If (st\pntr<>-4)
				r = Object.TStack_r(PeekInt(st\members,st\pntr))
				Return r\dat
			EndIf
		End Function
	
		Function TStack_Get$(st.TStack,n)
				Local r.TStack_r
			If (st\pntr<>-4) And n>-1 And n*4<(st\pntr-1)
				r = Object.TStack_r(PeekInt(st\members,n*4))
				Return r\dat
			EndIf
		End Function
		
				Function TStack_Remove(st.TStack,n) ;remove record
						Local r.TStack_r
						Local moveback
					If (st\pntr<>-4) And n>-1 And n*4<(st\pntr-1)
						For i = 0 To st\pntr Step 4
							If moveback Then
								PokeInt(st\members,i,PeekInt(st\members,i+4) )
							Else
								r = Object.TStack_r(PeekInt(st\members,i))
									If i = n*4 Then
										Delete r
										st\pntr = st\pntr - 4
										moveback = 1
										i = i - 4
									EndIf
							EndIf
						Next
					EndIf
				End Function
			
				Function TStack_Delete(st.TStack)
						Local r.TStack_r
					If (st\pntr<>-4)
						For i = 0 To st\pntr Step 4
							r = Object.TStack_r(PeekInt(st\members,i))
							Delete r
						Next
					EndIf
						FreeBank st\members
					Delete st
				End Function
		
	
	
	
	
	
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Пример:
m.TMap = CreateMap()

TMap_Insert(m,"banana","...")
TMap_Insert(m,"banana","phone")
TMap_Insert(m,"hue","hue")

Print TMap_Get(m,"banana")

TMap_Remove(m,"hue")
Print TMap_Get(m,"hue")

TMap_Delete(m)



s.TStack = CreateStack()

TStack_Push(s,"banana1")
TStack_Push(s,"banana2")
TStack_Push(s,"banana3")
TStack_Push(s,"banana4")
TStack_Push(s,"banana5")

Print TStack_Pop(s)
Print TStack_Pop(s)
Print TStack_GetLast(s)
Print TStack_Pop(s)
Print TStack_Get(s,2)



WaitKey
End
__________________

(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо Nerd за это полезное сообщение:
Кирпи4 (25.04.2013), SBJoker (06.04.2013)
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 18:34.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com