1
1
Fork 0
mirror of https://github.com/QB64Official/qb64.git synced 2024-07-16 14:15:15 +00:00
qb64/internal/help/GOSUB.md

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)