From QB64 Wiki
CALL sends code execution to a subroutine procedure in a program. In QB64 the subroutine doesn't need to be declared.
- CALL ProcedureName [(parameters, passed,...)]
- ProcedureName [parameters, passed,...]
- CALL requires that SUB program parameters be enclosed in brackets(parenthesis).
- CALL is NOT required to call a subprocedure. Use the SUB-procedure name and list any parameters without parenthesis.
- Neither syntax can be used to call GOSUB linelabel sub procedures.
- To pass by values, both syntaxes require that each of those variable names be enclosed in parenthesis.
- PDS or Quickbasic 7 up can use BYVAL to pass by values instead of reference.
- Quickbasic 4.5 can use BYVAL only for procedures created in Assembly or another language.
- Qbasic requires CALL ABSOLUTE only. It does not have to be DECLAREd.
Example: How parameters are passed in two SUB calls, one with CALL using brackets and one without CALL or brackets:
DIM a AS INTEGER 'value not shared with SUB DIM SHARED b AS INTEGER 'value shared with any SUB a = 1 b = 2 c = 3 CALL helloworld (a) 'a passed to c parameter with CALL helloworld a 'a passed to c parameter w/o CALL END SUB helloworld (c) 'SUB parameter variables are always inside of brackets in SUB code PRINT "Hello World!" PRINT a, b, c a = a + 1 'a is a SUB value of 0 when printed which may increase inside SUB only b = b + 1 'b is a shared value which can increase anywhere c = c + 1 'c is a SUB parameter value from a in calls which may increase inside SUB only END SUB
Hello World! 0 2 1 Hello World! 0 3 1
- Explanation: Variable a that is outside of the subroutine isn't SHARED so it will have no effect inside the subroutine, the variable a inside the subroutine is only valid inside the subroutine, and whatever value a has outside of it makes no difference within the subroutine.
- The variable b on the other hand is SHARED with the subroutines and thus can be changed in the subroutine. The variable a is initiated with 0 as default when created, thus it will return 0 since it wasn't changed within the subroutine.
- The variable c is the SUB parameter variable that passes values into the sub. Its value could be changed by the passed parameter value or inside of the subroutine. The un-shared c variable value outside of the sub is irrelevant within the subroutine.
- Note: CALL doesn't need to be used in order to call a subroutine. Just using the name of the sub with parameters and no brackets will do: helloworld a