Exit Select block?
BlitzMax Forums/BlitzMax Programming/Exit Select block?
| ||
Today i've come to need, but didn't find a way to exit out of a select block explicitly. Looks like some Basic dialects use "Exit Select" for this, while C has its "break". Of course, there's always the workaround of enveloping the Select block with and If block and using Exit, but i'd prefer a cleaner way. |
| ||
Doesn't 'Exit' work? If not post your code. |
| ||
Are you trying to say Blitzmax will continue checking though all of the Cases?Global b:Int Global a:Int=1 Select a Case 1 b=1 a=2 Case 2 b=2 a=3 Case 3 b=3 a=4 Case 4 b=4 a=5 Case 5 b=5 End Select Print b Looks to me once it finds a "case" it doesn't check anymore so it auto exits. :) |
| ||
a = 3 b = 2 Select a Case 3 Print "before" If b = 2 Exit Print "after" End Select doesn't compile. |
| ||
From the Docs: Exit causes program flow to exit the enclosing While, Repeat or For loop. What you need is this: a = 3 b = 2 Select a Case 3 Print "before" If b <> 2 then Print "after" EndIf End Select Or if the code is in a small function you could perhaps say If b=2 then Return which will exit the whole function. |
| ||
I knew there were workarounds, but seeing how other languages do have a keyword for this, I'd find it appropriate for BMax to have on too. |
| ||
If you have your Select block in a function, and there's nothing else in the function after the Select block, just stick a 'Return' in. |
| ||
I said that ;-) |
| ||
Or you could try:Global b:Int Global a:Int=1 Select a Case 1 b=1 aTMP=2 a=999 'Soft Exit-code Case 2 b=2 aTMP=3 a=999 ... ... Case 999 a=aTMP End Select Print b But maybe this is not a clean way? Oh, or this: Global b:Int Global a:Int=1 Local aTMP:Int = a Select aTMP Case 1 b=1 a=2 Case 2 b=2 a=3 ... ... End Select Print b Looks pretty clean to me. |
| ||
a=999 'Soft Exit-code Select in BlitzMax is *not* like switch in C/C++/Java/etc. Once you are in a Case, it won't fall through to any others. Once the end of Case is reached, code drops down to the statement after End Select. |
| ||
Ah, good. Im used to EasyTrieve (Cobol variant), it falls through there :( |
| ||
Here's an ugly way of doing it. :)a = 3 b = 2 Select a Case 3 Repeat 'Create a loop to exit from Print "before" If b = 2 Exit Print "after" Until 1 'Always exit the loop after one time through End Select |
| ||
I don't get why you need to exit out of a case block. A case block will end when it reaches the next case, default or end select. i.e superstrict local a : int = 2 local b : int select a case 1 ' blah case 2 ' only the code here ' upto here will be executed ' even having the following line a = 1 b = 2 ' will not stay in the case structure as it does not loop ' case 3 ' blah end select ' code will resume here print b It is not like a loop where you may need to 'exit' out prematurely and I'm sure blitzmax will use short circuit evaluation so only upto a match does it evaluate the testing expression. So you don't need to exit from a case at all. Cheers. |
| ||
I don't get why you need to exit out of a case block. If you want to exit a Case before the end of it. Suppose you have a character that can walk left, walk right, climb up a ladder, or slide down a chute. While he is walking, he could be on a platform or a treadmill. Do a select for which type of movement he is doing. If he is walking, then move the character left or right, unless he's on a treadmill, then any movement will cause him to stand still. psudocode: Select State Case WalkingLeft If OnTreadmill 'character on treadmill? If TreadmillLeft CharacterX :- 1 'Move the character faster if same direction as treadmill Else Exit 'exit from this case with no movement End If End If CharacterX :- 1 Case WalkingRight If OnTreadmill 'Character on treadmill? If TreadmillRight CharacterX :+ 1 'Move the character faster if same direction else Exit 'exit from this case with no movement End If End If Character :+ 1 Case Climbing CharacterY :- 1 Case Sliding CharacterY :+ 1 Case Standing End Select I know there are other ways to code that without needing an Exit, but sometimes it is just simpler to use. |
| ||
I know there are other ways to code that without needing an Exit, but sometimes it is just simpler to use. Yes, in your example not to have the else statement ;) |
| ||
I dunno about all this.. I've the impression that if you need such a construction your code structure is bad. It's a bit like going to a shoe factory and require shoes for your hands, only because you think you should walk on your hands instead of your feet.. :P TomToad's example is quite a bit oldskool.. ^_^ |