Compile Error: Labels must appear before a loop

BlitzMax Forums/BlitzMax Beginners Area/Compile Error: Labels must appear before a loop

TrickyRic(Posted 2005) [#1]

Compile Error: Labels must appear before a loop or DefData statement



...any idea's what this means? code in question is a relatively complex nest of if statements with various goto's pointing to this single label. no other labels exist in the project, and as far as i know all syntax is legal...

Function check_particle()
	Const x_less = grid_x - 1
	Const x_plus = grid_x + 1
	Const y_less = grid_y - 1
	Const y_plus = grid_y + 1
	If grid_x > 0 Then
		If xy_position[x_less, grid_y] > 30 Then
			colour_chosen = xy_colour[x_less, grid_y]
			Goto check_particle_b
		End If
		If grid_y > 0 Then
			If xy_position[x_less, y_less] > 30 Then
				colour_chosen = xy_colour[x_less, y_less]
				Goto check_particle_b
			End If
		End If
		If grid_y < height Then
			If xy_position[x_less, y_plus] > 30 Then
				colour_chosen = xy_colour[x_less, y_plus]
				Goto check_particle_b
			End If
		End If
	End If
	If grid_x < width Then
		If xy_position[x_plus, grid_y] > 30 Then
			colour_chosen = xy_colour[x_plus, grid_y]
			Goto check_particle_b
		End If
		If grid_y > 0 Then
			If xy_position[x_plus, y_less] > 30 Then
				colour_chosen = xy_colour[x_plus, y_less]
				Goto check_particle_b
			End If
		End If
	End If
	If grid_y > 0 Then
		If xy_position[grid_x, y_less] > 30 Then
			colour_chosen = xy_colour[grid_x, y_less]
			Goto check_particle
		End If
	End If
	If grid_y < height Then
		If xy_position[grid_x, y_plus] > 30 Then
			colour_chosen = xy_colour[grid_x, y_plus]
			Goto check_particle_b
		End If
	End If
	Return

	#check_particle_b

	If grid_x > 0 Then
		If xy_position[x_less, grid_y] = 0 Then
			place_particle()
			Return
		End If
		If grid_y > 0 Then
			If xy_position[x_less, y_less] = 0 Then
				place_particle()
				Return
			End If
		End If
		If grid_y < height Then
			If xy_position[x_less, y_plus] = 0 Then
				place_particle()
				Return
			End If
		End If
	End If
	If grid_x < width Then
		If xy_position[x_plus, grid_y] = 0 Then
			place_particle()
			Return
		End If
		If grid_y > 0 Then
			If xy_position(x_plus, y_less) = 0 Then
				place_particle()
				Return
			End If
		End If
		If grid_y < height Then
			If xy_position[x_plus, y_plus] = 0 Then
				place_particle()
				Return
			End If
		End If
	End If
	If grid_y > 0 Then
		If xy_position[grid_x, y_less] = 0 Then
			place_particle()
			Return
		End If
	End If
	If grid_y < height Then
		If xy_position[grid_x, y_plus] = 0 Then
			place_particle()
			Return
		End If
	End If
	Return
End Function



Perturbatio(Posted 2005) [#2]
are you using strict mode?


FlameDuck(Posted 2005) [#3]
...any idea's what this means?
No, but I'm guessing it has something to do with your return statement.

Is there any paricular reason you're not using Else and 2 seperate functions here?


TrickyRic(Posted 2005) [#4]

are you using strict mode?



...yes, does this alter anything? you got me interested so i commented it out and the assembler errored out on "case default" - my bad, shouldn't have left "case" in there. fixing that it now complains about my const's not being constant (which is odd...) unless i bring strict back, then it goes back to complaining about my label... hmm?

mikkel: hi there! respected you ever since your work in blitzmax (lol am i the only one sad enough to read the credits in the back of a manual???). never thought i'd meat you on a forum though...

anyhoo, to be honest i'm not sure what you mean by using seperate functions - due to the deprication of gosub i've had to change a fair amount to this structure, but its still about the simplest i could think of. in its original form i did indeed use seperate routines, but to keep from having to globally declare those statics i thought it best to merge the two. do you have a simpler solution?

the algorithm btw, is much like that of the classic "game of life", where a particle is only born if the surrounding particles are adequate. this function simply checks the surrounding particles (its been so long since my original implementation of it that these days i have no idea what exactly its looking for, lol. i really should get into the habit of commenting my code...).

cheers.


TrickyRic(Posted 2005) [#5]
woo!

spotted a typo, one of my goto's was pointing to check_particle rather than check_particle_b. changing that, commenting out strict, and replacing the const's with local's gets the project running!

results aren't as expected though, and after a few seconds execution ends. seems i must have made some oopsies porting that function accross... will have got a few checks backwards somewhere =).


TrickyRic(Posted 2005) [#6]
hmm... spotted what i assumed to be the only whoopsy in the project, fixed that and no change was made to the output. can't spot anything else...

whats more worrying though, is i noticed i wasn't running with debug enabled: enabled that and attempted to run. screen went black and mouse or keyboard interaction didn't end execution! all i could do was ctrl+backspace to restart the x server and log back in again... darent run it now lol!

[EDIT]
wasn't a one off, just did it again! appears x is crashing out for some reason, somewhere after mousemove()

current code:

Rem
	Written in BlitzMax 1.08 on GNU Linux.

	AuroraSaver - Aurora northern lights screensaver by Freefornow.co.uk
	Copyright (C) 2005 Richard Grant
	EMail: <email removed for web crawlers>
	Address: <address removed for web crawlers>

	This program is free software; you can redistribute it And/Or modify
	it under the terms of the GNU General Public License as published by
	the Free Software Foundation; either version 2 of the License, Or
	(at your option) any later version.

	This program is distributed in the hope that it will be useful,
	but WITHOUT ANY WARRANTY; without even the implied warranty of
	MERCHANTABILITY Or FITNESS For A PARTICULAR PURPOSE.  See the
	GNU General Public License For more details.

	You should have received a copy of the GNU General Public License
	along with this program; If Not, write To the Free Software
	Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
EndRem

Framework BRL.glMax2D
Import BRL.Random
Import BRL.StandardIO
Import BRL.System

'Strict

Local width = 400, height = 300, mode = 16

If Not GraphicsModeExists(400, 300, 16) Then
	If GraphicsModeExists(400, 300, 24) Then
		mode = 24
	Else
		width = 800
		height = 600
		If Not GraphicsModeExists(800, 600, 16) Then
			If GraphicsModeExists(800, 600, 24) Then
				mode = 24
			Else
				RuntimeError "Cannot initialise a suitable resolution; Execution has terminated!"
				End
			End If
		End If
	End If
End If

' Global Ints
Global grid_x = 0, grid_y = 0
Global one_fourth_width = width / 4, one_fourth_height = height / 4
Global three_fourth_width = one_fourth_width * 3, three_fourth_height = one_fourth_height * 3
Global half_width = width / 2, half_height = height / 2
Global loops = 0, finished_fading = 0, colour = 0

' Global Strings
Global colour_chosen:String = "g"

' Global Arrays
Global xy_colour:String[width, height], xy_position[width, height]

SeedRnd MilliSecs()

Repeat
	grid_x = Rnd(0, width)
	grid_y = Rnd(0, height)
Until grid_x < one_fourth_width Or grid_x > three_fourth_width Or grid_y < one_fourth_height Or grid_y > three_fourth_height

place_particle()

Graphics width, height, mode

HideMouse()
MoveMouse(half_width, half_height)

While MouseX() = 0 Or MouseY() = 0
Wend

While (GetChar() + MouseHit(1) + MouseHit(2) + MouseHit(3) + MouseZ() = 0) And MouseX() = half_width And MouseY() = half_height
	If loops = 1000 Then
		finished_fading = 1
		For grid_x = 0 To width
			For grid_y = 0 To height
				If xy_position[grid_x, grid_y] > 0 Then
					finished_fading = 0
					If xy_position[grid_x, grid_y] < 6 Then
						xy_position[grid_x, grid_y] = 0
					Else
						xy_position[grid_x, grid_y] = xy_position[grid_x, grid_y] - 5
					End If
					draw_particle()
				End If
			Next
		Next
		If finished_fading = 1 Then
			loops = 0
			Cls
			generate_particle()
		End If
	Else
		loops = loops + 1
		If loops Mod 150 = 0 Then generate_particle()
		For grid_x = 0 To width
			For grid_y = 0 To height
				If xy_position[grid_x, grid_y] = 0 Then
					If Int(Rnd(0, 3)) = 0 Then check_particle()
				Else
					xy_position[grid_x, grid_y] = xy_position[grid_x, grid_y] - 1
					draw_particle()
				End If
			Next
		Next
	End If
	FlushMem
	Flip
Wend
End

Function check_particle()
	Local x_less = grid_x - 1
	Local x_plus = grid_x + 1
	Local y_less = grid_y - 1
	Local y_plus = grid_y + 1
	If grid_x > 0 Then
		If xy_position[x_less, grid_y] > 30 Then
			colour_chosen = xy_colour[x_less, grid_y]
			Goto check_particle_b
		End If
		If grid_y > 0 Then
			If xy_position[x_less, y_less] > 30 Then
				colour_chosen = xy_colour[x_less, y_less]
				Goto check_particle_b
			End If
		End If
		If grid_y < height Then
			If xy_position[x_less, y_plus] > 30 Then
				colour_chosen = xy_colour[x_less, y_plus]
				Goto check_particle_b
			End If
		End If
	End If
	If grid_x < width Then
		If xy_position[x_plus, grid_y] > 30 Then
			colour_chosen = xy_colour[x_plus, grid_y]
			Goto check_particle_b
		End If
		If grid_y > 0 Then
			If xy_position[x_plus, y_less] > 30 Then
				colour_chosen = xy_colour[x_plus, y_less]
				Goto check_particle_b
			End If
		End If
		If grid_y < height Then
			If xy_position[x_plus, y_plus] > 30 Then
				colour_chosen = xy_colour[x_plus, y_plus]
				Goto check_particle_b
			End If
		End If
	End If
	If grid_y > 0 Then
		If xy_position[grid_x, y_less] > 30 Then
			colour_chosen = xy_colour[grid_x, y_less]
			Goto check_particle_b
		End If
	End If
	If grid_y < height Then
		If xy_position[grid_x, y_plus] > 30 Then
			colour_chosen = xy_colour[grid_x, y_plus]
			Goto check_particle_b
		End If
	End If
	Return

	#check_particle_b

	If grid_x > 0 Then
		If xy_position[x_less, grid_y] = 0 Then
			place_particle()
			Return
		End If
		If grid_y > 0 Then
			If xy_position[x_less, y_less] = 0 Then
				place_particle()
				Return
			End If
		End If
		If grid_y < height Then
			If xy_position[x_less, y_plus] = 0 Then
				place_particle()
				Return
			End If
		End If
	End If
	If grid_x < width Then
		If xy_position[x_plus, grid_y] = 0 Then
			place_particle()
			Return
		End If
		If grid_y > 0 Then
			If xy_position(x_plus, y_less) = 0 Then
				place_particle()
				Return
			End If
		End If
		If grid_y < height Then
			If xy_position[x_plus, y_plus] = 0 Then
				place_particle()
				Return
			End If
		End If
	End If
	If grid_y > 0 Then
		If xy_position[grid_x, y_less] = 0 Then
			place_particle()
			Return
		End If
	End If
	If grid_y < height Then
		If xy_position[grid_x, y_plus] = 0 Then
			place_particle()
			Return
		End If
	End If
End Function

Function place_particle()
	xy_position[grid_x, grid_y] = 100
	xy_colour[grid_x, grid_y] = colour_chosen
End Function

Function draw_particle()
	Select xy_colour[grid_x, grid_y]
		Case "g"
			SetColor(0, xy_position[grid_x, grid_y], 0)
		Case "r"
			SetColor(xy_position[grid_x, grid_y], 0, 0)
		Case "y"
			SetColor(xy_position[grid_x, grid_y], xy_position[grid_x, grid_y], 0)
	End Select
	DrawRect(grid_x - 1, grid_y - 1, 2, 2)
End Function

Function generate_particle()
	Repeat
		grid_x = Rnd(0, width)
		grid_y = Rnd(0, height)
	Until grid_x < one_fourth_width Or grid_x > three_fourth_width Or grid_y < one_fourth_height Or grid_y > three_fourth_height
	If xy_position[grid_x, grid_y] = 0 Then
		colour = Rnd(0, 11)
		Select True
			Case colour <= 5
				colour_chosen = "g"
			Case colour >= 6 And colour <=9
				colour_chosen = "r"
			Default
				colour_chosen = "y"
		End Select
		place_particle()
	End If
End Function



TrickyRic(Posted 2005) [#7]
EH???

i'm beginning to ge the feeling the compiler itself is buggy now!

if i change the graphics mode to ANYTHING other than 400x300, the project doesn't even attempt to run! yet if i create a new project i can use whatever mode i like!

how can this be???


TrickyRic(Posted 2005) [#8]
wahay! a little reading up suggested goto was depricated if using strict mode, so i seperated into 2 functions and strict mode started telling me of a few typo's. fixed them, altered the arrays a little, and voila all is working!

took more work than i expected to port this thing over, but its finally running and i take it all back - can't blame a "buggy compiler" now hehe.

cheers guys. current working code is below if interested. not quite a screensaver yet though as i need to find a way to read o/s specific params passed when launching a screensaver... and currently i only know of win32 params (/c, -c, /p, -p, etc.).

Rem
	Written in BlitzMax 1.08 on GNU Linux.

	AuroraSaver - Aurora northern lights screensaver by Freefornow.co.uk
	Copyright (C) 2005 Richard Grant
	EMail: <email removed for web crawlers>
	Address: <address removed for web crawlers>

	This program is free software; you can redistribute it And/Or modify
	it under the terms of the GNU General Public License as published by
	the Free Software Foundation; either version 2 of the License, Or
	(at your option) any later version.

	This program is distributed in the hope that it will be useful,
	but WITHOUT ANY WARRANTY; without even the implied warranty of
	MERCHANTABILITY Or FITNESS For A PARTICULAR PURPOSE.  See the
	GNU General Public License For more details.

	You should have received a copy of the GNU General Public License
	along with this program; If Not, write To the Free Software
	Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
EndRem

Framework BRL.glMax2D
Import BRL.Random
Import BRL.StandardIO
Import BRL.System

Strict

Global width = 400, height = 300

Local mode = 16

If Not GraphicsModeExists(400, 300, 16)
	If GraphicsModeExists(400, 300, 24)
		mode = 24
	Else
		width = 800
		height = 600
		If Not GraphicsModeExists(800, 600, 16)
			If GraphicsModeExists(800, 600, 24)
				mode = 24
			Else
				RuntimeError "Cannot initialise a suitable resolution; Execution has terminated!"
				End
			EndIf
		EndIf
	EndIf
EndIf

Global grid_x = 0, grid_y = 0
Global one_fourth_width = width / 4, one_fourth_height = height / 4
Global three_fourth_width = one_fourth_width * 3, three_fourth_height = one_fourth_height * 3
Global half_width = width / 2, half_height = height / 2
Global x_plus = 0, x_less = 0, y_plus = 0, y_less = 0
Global loops = 0, finished_fading = 0, colour = 0

Global colour_chosen:String = "g"

Global xy_colour:String[width + 1, height + 1], xy_position[width + 1, height + 1]

SeedRnd MilliSecs()

Repeat
	grid_x = Rnd(0, width)
	grid_y = Rnd(0, height)
Until grid_x < one_fourth_width Or grid_x > three_fourth_width Or grid_y < one_fourth_height Or grid_y > three_fourth_height

place_particle()

Graphics width, height, mode

HideMouse()
MoveMouse(half_width, half_height)

While MouseX() = 0 Or MouseY() = 0
Wend

While (GetChar() + MouseHit(1) + MouseHit(2) + MouseHit(3) + MouseZ() = 0) And MouseX() = half_width And MouseY() = half_height
	If loops = 1000
		finished_fading = 1
		For grid_x = 0 To width
			For grid_y = 0 To height
				If xy_position[grid_x, grid_y] > 0
					finished_fading = 0
					If xy_position[grid_x, grid_y] < 6
						xy_position[grid_x, grid_y] = 0
					Else
						xy_position[grid_x, grid_y] = xy_position[grid_x, grid_y] - 5
					EndIf
					draw_particle()
				EndIf
			Next
		Next
		If finished_fading = 1
			loops = 0
			Cls
			generate_particle()
		EndIf
	Else
		loops = loops + 1
		If loops Mod 150 = 0 Then generate_particle()
		For grid_x = 0 To width
			For grid_y = 0 To height
				If xy_position[grid_x, grid_y] = 0
					If Int(Rnd(0, 3)) = 0 Then check_particle()
				Else
					xy_position[grid_x, grid_y] = xy_position[grid_x, grid_y] - 1
					draw_particle()
				EndIf
			Next
		Next
	EndIf
	FlushMem
	Flip
Wend
End

Function check_particle()
	x_less = grid_x - 1
	x_plus = grid_x + 1
	y_less = grid_y - 1
	y_plus = grid_y + 1
	If grid_x > 0
		If xy_position[x_less, grid_y] > 30
			colour_chosen = xy_colour[x_less, grid_y]
			check_particle_b()
			Return
		EndIf
		If grid_y > 0
			If xy_position[x_less, y_less] > 30
				colour_chosen = xy_colour[x_less, y_less]
				check_particle_b()
				Return
			EndIf
		EndIf
		If grid_y < height
			If xy_position[x_less, y_plus] > 30
				colour_chosen = xy_colour[x_less, y_plus]
				check_particle_b()
				Return
			EndIf
		EndIf
	EndIf
	If grid_x < width
		If xy_position[x_plus, grid_y] > 30
			colour_chosen = xy_colour[x_plus, grid_y]
			check_particle_b()
			Return
		EndIf
		If grid_y > 0
			If xy_position[x_plus, y_less] > 30
				colour_chosen = xy_colour[x_plus, y_less]
				check_particle_b()
				Return
			EndIf
		EndIf
		If grid_y < height
			If xy_position[x_plus, y_plus] > 30
				colour_chosen = xy_colour[x_plus, y_plus]
				check_particle_b()
				Return
			EndIf
		EndIf
	EndIf
	If grid_y > 0
		If xy_position[grid_x, y_less] > 30
			colour_chosen = xy_colour[grid_x, y_less]
			check_particle_b()
			Return
		EndIf
	EndIf
	If grid_y < height
		If xy_position[grid_x, y_plus] > 30
			colour_chosen = xy_colour[grid_x, y_plus]
			check_particle_b()
			Return
		EndIf
	EndIf
EndFunction

Function check_particle_b()
	If grid_x > 0
		If xy_position[x_less, grid_y] = 0
			place_particle()
			Return
		EndIf
		If grid_y > 0
			If xy_position[x_less, y_less] = 0
				place_particle()
				Return
			EndIf
		EndIf
		If grid_y < height
			If xy_position[x_less, y_plus] = 0
				place_particle()
				Return
			EndIf
		EndIf
	EndIf
	If grid_x < width
		If xy_position[x_plus, grid_y] = 0
			place_particle()
			Return
		EndIf
		If grid_y > 0
			If xy_position[x_plus, y_less] = 0
				place_particle()
				Return
			EndIf
		EndIf
		If grid_y < height
			If xy_position[x_plus, y_plus] = 0
				place_particle()
				Return
			EndIf
		EndIf
	EndIf
	If grid_y > 0
		If xy_position[grid_x, y_less] = 0
			place_particle()
			Return
		EndIf
	EndIf
	If grid_y < height
		If xy_position[grid_x, y_plus] = 0
			place_particle()
			Return
		EndIf
	EndIf
EndFunction

Function place_particle()
	xy_position[grid_x, grid_y] = 100
	xy_colour[grid_x, grid_y] = colour_chosen
EndFunction

Function draw_particle()
	Select xy_colour[grid_x, grid_y]
		Case "g"
			SetColor(0, xy_position[grid_x, grid_y], 0)
		Case "r"
			SetColor(xy_position[grid_x, grid_y], 0, 0)
		Case "y"
			SetColor(xy_position[grid_x, grid_y], xy_position[grid_x, grid_y], 0)
	EndSelect
	DrawRect(grid_x - 1, grid_y - 1, 2, 2)
EndFunction

Function generate_particle()
	Repeat
		grid_x = Rnd(0, width)
		grid_y = Rnd(0, height)
	Until grid_x < one_fourth_width Or grid_x > three_fourth_width Or grid_y < one_fourth_height Or grid_y > three_fourth_height
	If xy_position[grid_x, grid_y] = 0
		colour = Rnd(0, 11)
		Select True
			Case colour <= 5
				colour_chosen = "g"
			Case colour >= 6 And colour <=9
				colour_chosen = "r"
			Default
				colour_chosen = "y"
		EndSelect
		place_particle()
	EndIf
EndFunction