mirror of
https://github.com/QB64Official/qb64.git
synced 2024-09-28 11:17:47 +00:00
80 lines
1.9 KiB
Markdown
80 lines
1.9 KiB
Markdown
|
[GOSUB](GOSUB) sends the program flow to a sub procedure identified by a line number or label.
|
||
|
|
||
|
## Syntax
|
||
|
|
||
|
> GOSUB {lineNumber|label}
|
||
|
|
||
|
## Description
|
||
|
|
||
|
* Use [RETURN](RETURN) in a sub procedure to return to the next line of code after the original [GOSUB](GOSUB) call. [END](END) or [SYSTEM](SYSTEM) can also be used to end program.
|
||
|
* GOSUB and GOTO can be used **within** [SUB](SUB) or [FUNCTION](FUNCTION) procedures, but cannot refer to a label located outside the procedure.
|
||
|
|
||
|
## QBasic
|
||
|
|
||
|
* Too many GOSUBs without a [RETURN](RETURN) can eventually cause "Out of Stack Errors" in QBasic as each GOSUB uses memory to store the location to return to. Each [RETURN](RETURN) frees the memory of the GOSUB it returns to.
|
||
|
|
||
|
## Example(s)
|
||
|
|
||
|
Simple usage of GOSUB
|
||
|
|
||
|
```vb
|
||
|
|
||
|
PRINT "1. It goes to the subroutine."
|
||
|
GOSUB subroutine
|
||
|
PRINT "3. And it returns."
|
||
|
END
|
||
|
|
||
|
subroutine:
|
||
|
PRINT "2. It is at the subroutine."
|
||
|
RETURN
|
||
|
|
||
|
|
||
|
```
|
||
|
|
||
|
```text
|
||
|
|
||
|
1. It goes to the subroutine.
|
||
|
2. It is at the subroutine.
|
||
|
3. And it returns.
|
||
|
|
||
|
```
|
||
|
|
||
|
What happens if two GOSUB executes then two RETURN's?
|
||
|
|
||
|
```vb
|
||
|
|
||
|
start:
|
||
|
|
||
|
a = a + 1
|
||
|
IF a = 1 THEN GOSUB here: PRINT "It returned to IF a = 1": END
|
||
|
IF a = 2 THEN GOSUB there: PRINT "It returned to IF a = 2": RETURN
|
||
|
|
||
|
here:
|
||
|
PRINT "It went here."
|
||
|
GOTO start
|
||
|
|
||
|
there:
|
||
|
PRINT "It went there."
|
||
|
RETURN
|
||
|
|
||
|
```
|
||
|
|
||
|
```text
|
||
|
|
||
|
It went here.
|
||
|
It went there.
|
||
|
It returned to IF a = 2
|
||
|
It returned to IF a = 1
|
||
|
|
||
|
```
|
||
|
|
||
|
*Explanation:* When a = 1 it uses GOSUB to go to "here:", then it uses GOTO to go back to "start:". a is increased by one so when a = 2 it uses GOSUB to go to "there:", and uses RETURN to go the last GOSUB (which is on the IF a = 2 line), it then encounters another RETURN which makes it return to the first GOSUB call we used on the IF a = 1 line.
|
||
|
|
||
|
## See Also
|
||
|
|
||
|
* [ON...GOSUB](ON...GOSUB)
|
||
|
* [ON...GOTO](ON...GOTO), [GOTO](GOTO)
|
||
|
* [ON ERROR](ON-ERROR), [RESUME](RESUME)
|
||
|
* [ON TIMER (n)](ON-TIMER-(n))
|
||
|
* [Line number](Line-number)
|