Array of type handles

BlitzMax Forums/BlitzMax Beginners Area/Array of type handles

What is the correct syntax for this? This is what I assumed to be correct, but unfortunately does not seem to be so.

Type Cube Extends Entity
	Field ver[9]:vertex


Its right, but a couple of points to note:

1. That code will give an array with nine elements, numbered 0-8.

2. Each element will be Null by default. To create the objects:
For n = 0 to 8
  ver[n] = New vertex
Next


[edit] ...and what Brucey said, below.

More like this :
	Field ver:vertex[9]


I'm getting this error when I compile the code:

BlitzMax Application
Compile Error
Syntax error in user defined type declaration
[OK]

and places the cursor on this line:
	Field ver[9]:vertex



Global entities=0
Type Entity
	Global list:tlist=CreateList()
	Field id
	Field vertex_count

	Method Scale(x#,y#,z#)
		'find center (average xyz of the vertecies)
		Local avgx#=0,avgy#=0,avgz#=0
		For scal=1 To vertex_count
			avgx:+ver[scal].x
			avgy:+ver[scal].y
			avgz:+ver[scal].z
		Next
		avgx:/vertex_count
		avgy:/vertex_count
		avgz:/vertex_count
		'scale it
		For scal=1 To vertex_count
			ver[scal].x=((ver[scal].x-avgx)*x)+avgx
			ver[scal].y=((ver[scal].x-avgy)*y)+avgy
			ver[scal].z=((ver[scal].x-avgz)*z)+avgz
		Next
	End Method
	
End Type

Type Cube Extends Entity
	Field ver[9]:vertex
	Field trig[13]:tri
	
	Function Create:Cube(x#,y#,z#)
		Local s=1,sx=0,sy=0,sz=0
		c:Cube=New Cube
		ver[1]=vertex.Create(s+sx,s+sy,s+sz)
		ver[2]=vertex.Create(s+sx,-s+sy,s+sz)
		ver[3]=vertex.Create(-s+sx,s+sy,s+sz)
		ver[4]=vertex.Create(-s+sx,-s+sy,s+sz)
		ver[5]=vertex.Create(s+sx,s+sy,-s+sz)
		ver[6]=vertex.Create(s+sx,-s+sy,-s+sz)
		ver[7]=vertex.Create(-s+sx,s+sy,-s+sz)
		ver[8]=vertex.Create(-s+sx,-s+sy,-s+sz)
		trig[1]=tri.Create(ver[4],ver[3],ver[2])
		trig[2]=tri.Create(ver[1],ver[3],ver[2])
		trig[3]=tri.Create(ver[6],ver[7],ver[8])
		trig[4]=tri.Create(ver[7],ver[6],ver[5])
		trig[5]=tri.Create(ver[4],ver[8],ver[7])
		trig[6]=tri.Create(ver[4],ver[3],ver[7])
		trig[7]=tri.Create(ver[5],ver[6],ver[2])
		trig[8]=tri.Create(ver[5],ver[1],ver[2])
		trig[9]=tri.Create(ver[5],ver[3],ver[1])
		trig[10]=tri.Create(ver[7],ver[3],ver[5])
		trig[11]=tri.Create(ver[8],ver[6],ver[2])
		trig[12]=tri.Create(ver[4],ver[8],ver[2])
		c.vertex_count=8
		entities:+1;c.id=entities
		Return c:Cube
	End Function
	
End Type


Alright, saw brucey's post and fixed that.
Now I get this error:

Compile Error
Expression of type 'Int' cannot be indexed

on this line:
			avgx:+ver[scal].x


That means your reference to 'ver' has not been defined as an array. Its still default (Int).

Offtopic: Sorry for the rude offtopic, but I really need a guru to look at my "Noob Tlist" thread. I'm at a total stand still with that. Thanks.

Gfk, how do I fix that?

Offtopic: Sorry for the rude offtopic, but I really need a guru to look at my "Noob Tlist" thread. I'm at a total stand still with that. Thanks.
For being so rude, I'm not going to look.

I *think* you might need to use 'super' fix it. Not 100% because I don't use extended types that much.
avgx:+super.ver[scal].x


You should think about using SuperStrict. It forces you to define all your variable types.

It helps to get rid of certain kinds of bugs.

Brucey said a mouthful. Although I'm just using Strict, at the moment.

I used to use Blitz3D and when I moved to Blitzmax I was strongly against Strict/Superstrict. However, if you start a project and type Strict before anything else, its guaranteed to save you hours of stress later. Makes the debugging process much easier.

I always thought of Strict/SuperStrict as annoyances, but it helps a lot. Thanks.

Yes, use SuperStrict. Your problem is that ver is a field of the Cube type, though, so it should be...
c.ver[1]=vertex.Create(s+sx,s+sy,s+sz)

...and so on. You have to say which object's fields you are talking about in class functions (as it's only implicit in methods).

I'm still using Strict, it saves loads of time chasing dumb bugs. I forget why superstrict is supposed to be so good (I know you have to declare ints as you can't leave a variable with no type anymore), but anything else?

And using Strict or SuperStrict results in faster compiled code. Another reason to use on or the other.

And using Strict or SuperStrict results in faster compiled code
Really? How's that?

As it knows precisely what variables are what and what scope they are in, it can make a number of optimisations that otherwise the compiler could not do, as it always couldn't be sure that a new, undeclared variable might just appear out of the blue.

As far as I know Strict and SuperStrict both compile to the same code, it's just a matter of having to declare ints as such or not. But if everything apart from int has to be declared, the compiler can know without a doubt what's meant to be an int.