Help with array of types

BlitzPlus Forums/BlitzPlus Programming/Help with array of types

Hi....I Need some help with arrays of types:

I know that you can create an array within a type's field(with square brackets) like this(I think):

eg: Type thing
Field stuff[10]
End Type

This is easy to figure out, but I've recently found out that you can make an array of the whole type

eg: using the above example - Dim things.thing(50)


I'm not sure how to address each array element and field etc - what's the format for this?

Also - can you create a different number of New objects in each array element
ie: Array element no. 1 has 10 thing objects
Array element no. 2 has 15 thing objects
etc......

I've just begun to get my head around types in general - this extra dimension stuff is very useful but can be a bit confusing at first -and there's not much about it in the docs yet.
Any help with this and tips for using types in general will be of great help. Thanks.

Each array element can hold only one object. BUT that object could be a part of a link list. Then you could have an virtually unlimited number of object "pointed" to by each array element. If you are unfamiliar with link lists I would be happy to post a demo. ( The below code worked for addressing individual array element, object fields.)

Type Thing
 Field x
 Field prv.Thing
 Field nxt.Thing
End Type

Dim things.Thing(50)

Print "Array type test..."
things(0) = New Thing
things(0)\x = 10
Print things(0)\x
WaitKey()


Thanks Moore - that sorts 'things' out a bit for me.
I'm supposing the fields prv.Thing and nxt.Thing are to create the linked list so you know the order of all your objects - actually - a demo would be quite handy.
Anyway, thanks for the help with addressing objects/fields.

Hope this helps! :)
; This demo shows the use of double or bi-directional LINK LISTS and CONTAINER CLASSES
; A LINK LIST is a common way of using pointers to string objects together
; each object will contain a pointer to the next object in the list and the previous object in the list
; The pointer to the first object in the list is often called te HEAD
; The previous pointer of the first object in the list will be NULL
; The next pointer of the the last object in the list will be NULL
; If the HEAD is the only object in the list both the previous and next pointers will be NULL
; If there are NO objects in the list then the HEAD pointer will be NULL

; A container class is a class that points to the object that we are working with as well as the next
; and previous objects in the LINK LIST. This allows and object to be part of many LINK LISTS and not 
; just one, which is what would result if the DATA OBJECT (that is the main object that we are
; working with that contains the real data) contained the nxt/prv links.

; Check out the wikipedia.org artical on link lists for more info
; By Naphtali Moore, email me at NRMStudios at my yahoo.com account

Type Guild
	Field Name$, Description$
	Field head.gMember
End Type

Type gMember ; This is our container class
	Field c.character
	Field prv.gMember
	Field nxt.gMember
End Type

Type character ; 
 Field Name$, HP, Def
End Type

curGuild.guild = new_Guild("Super Heros", "A group of powerful heros.") ; Create a Guild
; Create characters
p1.character = new_Character("Super Man", 100, 100)
p2.character = new_Character("Spider-Man", 40, 60)
p3.character = new_Character("Batman", 50, 75)

; Add characters to our guild
add_gMember(curGuild, p1)
add_gMember(curGuild, p2)
add_gMember(curGuild, p3)

; list the members
listMembers(curGuild)

;remove a member and list again
remove_gMember(curGuild, p2)
Print "": Print "Spider-Man has been removed." : Print ""
listMembers(curGuild)

;remove a member and list again
remove_gMember(curGuild, p1)
Print "": Print "Super Man has been removed." : Print ""
listMembers(curGuild)

;remove a member and list again
remove_gMember(curGuild, p3)
Print "": Print "Batman has been removed." : Print ""
listMembers(curGuild)

Print " "
Input("Please hit [ENTER] to end program.") ; wait for return to end
End

Function listMembers(g.Guild)
	If g = Null Return
	temp.gMember = g\head
	Print "Guild Name: " + g\name
	Print "========= MEMBER  LIST ========="
	If temp = Null Then Print "This guild has NO members."
	While temp <> Null
	    i = i + 1
		Print i + ") " + temp\c\name + " HP:" + temp\c\hp + " DEF:" + temp\c\def 
		temp = temp\nxt
	Wend
End Function

Function new_character.character(name$, hp, def)
	c.character = New character
	c\name = name
	c\hp = hp
	c\def = def
	Return c
End Function

Function new_Guild.Guild(name$, descrpt$)
	g.Guild = New Guild
	g\name = name
	g\description = descrpt
	Return g
End Function

Function add_gMember(g.guild, c.character)
	If g = Null Or c = Null Then Return False ; This protects against errors
	gM.gMember = New gMember ; create a new container object
	gM\c = c ; assign character to container object
	
	If g\head = Null Then ; if member list is empty
		g\head = gM ; assign new object to first object of the list
		Return True ; return possitive result
	EndIf
		
	temp.gMember = g\head ; get first object in list
	While temp\nxt <> Null ; continue through list till you reach the last object
		temp = temp\nxt ; move to next object
	Wend

	temp\nxt = gM ; point the last object to the new object 
	gM\prv = temp ; point the new object to the last object
	Return True	  ; return positive result	
End Function

Function remove_gMember(g.guild, c.character)
	If g = Null If c = Null Then Return False ; This protects against errors
	If g\head = Null Return False
	temp.gMember = g\head
	
	If g\head\c = c Then ; character is in first object of list
		If g\head\nxt <> Null Then ; character is not only object in list
			g\head = g\head\nxt ; make second object in list the first object in list
		Else ; character is only object in list
			g\head = Null 
		EndIf
	Else
		While temp\c <> c ; while object does not contain the character we are removing
			temp = temp\nxt ; move to next object
			If temp = Null Then Return False ; object not in list return negitive
		Wend	
		If temp\nxt <> Null Then ; character is in middle of list
			temp\prv\nxt = temp\nxt ; point the prv object to the nxt object
			temp\nxt\prv = temp\prv ; point the nxt object to the prv object
		Else ; character is in last object in list
			temp\prv\nxt = Null ; make prv object last object in list
		EndIf
	EndIf
	
	temp\c = Null ; remove pointer to our character
	Delete temp ; delete the object containing our character
	Return True	; return a positive result	
End Function


Many Thanks, Moore. I shall pick my way through this and see if I can get my head 'round it. Cheers.