array of type bad code !

BlitzMax Forums/BlitzMax Beginners Area/array of type bad code !

Could you help me to understand what's bad with this code ? Thanks !

My goal is to replace list by arrays into my game to access quickly and directly to an occurence (avoid a lot of 'for-eachin MyList-next loops) !

Strict

Global Rect_list : TList = CreateList()

Type TRect

	Field Id : Int
	Field x : Int
	Field y : Int
	Field r : Int
	Field g : Int
	Field b : Int
	
	Function Create:TRect (id, x,y)
	
		Local r:TRect = New TRect
		
		r.Id = Id
		r.x = x
		r.y = y
		
		r.r = Rand (0,255)
		r.g = Rand (0,255)
		r.b = Rand (0,255)
		
		ListAddLast Rect_list, r
		
	End Function
	
	Function Draw_all_with_list ()
	
		For Local r:TRect = EachIn Rect_list
		
			SetColor r.r,r.g,r.b
			DrawRect r.x, r.y, 32,32
			
		Next
		
		SetColor 255,255,255
		
	End Function
	
	Method Draw_it ()
	
			SetColor r,g,b
			DrawRect x, y, 32,32
			SetColor 255,255,255
			
	End Method
	
End Type

Graphics 800,600			

Global array_of_rect : TRect[]
			
Local NbRect = Rand (100,200)

For Local i=1 To NbRect
	
	TRect.Create (i,Rand (0,800),Rand (0,600))
Next

array_of_rect = New TRect[NbRect]

For Local i=0 To NbRect - 1
	array_of_rect[i] = TRect.Create (i,Rand (0,800),Rand (0,600))
Next

While Not KeyDown (KEY_ESCAPE)

	Cls
	
	TRect.Draw_all_with_list()
	
	array_of_rect[15].Draw_it() ' <---- i want display item 15 : ERROR : attempt to access field or null object

	Flip
	
Wend 


oups, corrected myself

	Function Create:TRect (id, x,y)
	
		Local r:TRect = New TRect
		
		r.Id = Id
		r.x = x
		r.y = y
		
		r.r = Rand (0,255)
		r.g = Rand (0,255)
		r.b = Rand (0,255)
		
		ListAddLast Rect_list, r
		
		Return r ' <---- i've forgot this !
		
	End Function


There is no reason this code should not work.
works here without any problem, so you most likely have some other problem. (you are on BM 1.22, right?)

Thanks Dreamora, i've corrected myself the code by adding the 'return r' line ;-)

Ah so that meant that this actually solved the problem. thought you meant it more of a "correction to above code" posting where you forgot to copy / write something.

but none the less: good it works now

but i don't understand why the following code doesn't work.

Strict

Global array_of_rect : TRect[]

Type TRect

	Field Id : Int
	Field x : Int
	Field y : Int
	Field r : Int
	Field g : Int
	Field b : Int
	
	Function Create:TRect (id, x,y)
	
		Local r:TRect = New TRect
		
		r.Id = Id
		r.x = x
		r.y = y
		
		r.r = Rand (0,255)
		r.g = Rand (0,255)
		r.b = Rand (0,255)
		
		Return r
		
	End Function
	
	Function Draw_all ()
	
		For Local r:TRect = EachIn array_of_rect
		
			SetColor r.r,r.g,r.b
			DrawRect r.x, r.y, 32,32
			
		Next
		
		SetColor 255,255,255
		
	End Function
	
	Method Draw_it ()
	
			SetColor r,g,b
			DrawRect x, y, 32,32
			SetColor 255,255,255
			
	End Method
	
	
End Type

Graphics 800,600			
			

For Local i=0 To 99

	array_of_rect = New TRect[i+1]
	array_of_rect[I] = TRect.Create (i,Rand (0,800),Rand (0,600))
		
Next

'array_of_rect.sort

While Not KeyDown (KEY_ESCAPE)

	Cls
	
	TRect.Draw_all()
	array_of_rect[15].Draw_it()
	
	Flip
	
Wend 


Thats quite easy:

With array_of_rect = new TRect[i+1] you replace the old one, ie all the objects within as well.

What you would need to do there is slicing:

array_of_rect = array_of_rect[..i+1]

BUT: if you raise it by one, this would be the worst idea you could have as it is massively slowing down. If you use slicing, only do it by length*2 and length/2 (as general rule)

You have your slice wrong and you're creating 2 new trect each loop.
Strict

Global array_of_rect : TRect[]

Type TRect

	Field Id : Int
	Field x : Int
	Field y : Int
	Field r : Int
	Field g : Int
	Field b : Int
	
	Function Create:TRect (id, x,y)
	
		Local r:TRect = New TRect
		
		r.Id = Id
		r.x = x
		r.y = y
		
		r.r = Rand (0,255)
		r.g = Rand (0,255)
		r.b = Rand (0,255)
		
		Return r
		
	End Function
	
	Function Draw_all ()
	
		For Local r:TRect = EachIn array_of_rect
		
			SetColor r.r,r.g,r.b
			DrawRect r.x, r.y, 32,32
			
		Next
		
		SetColor 255,255,255
		
	End Function
	
	Method Draw_it ()
	
			SetColor r,g,b
			DrawRect x, y, 32,32
			SetColor 255,255,255
			
	End Method
	
	
End Type

Graphics 800,600			
			
'Changed slice and also took out the extra *new*
For Local i=0 To 99
    array_of_rect=array_of_rect[..Len(array_of_rect)+1]
	array_of_rect[i] = TRect.Create (i,Rand (0,800),Rand (0,600))
		
Next

'array_of_rect.sort

While Not KeyDown (KEY_ESCAPE)

	Cls
	
	TRect.Draw_all()
	array_of_rect[15].Draw_it()
	
	Flip
	
Wend