SUB: Difference between revisions

From QB64 Phoenix Edition Wiki
Jump to navigation Jump to search
(Created page with "A '''SUB''' procedure is a procedure within a program that can calculate and return multiple parameter values just like a full program. {{PageSyntax}} :: '''SUB Procedure_name''' [(''parameter''[, ''list''...])] :: ... :: ... 'procedure variable definitions and statements :: ... :: '''END SUB''' {{Parameters}} * Parameters passed after the procedure call must match the variable types in the SUB parameters in order. * If there are no ''parameter''s passed or they are...")
 
No edit summary
 
(9 intermediate revisions by the same user not shown)
Line 3: Line 3:


{{PageSyntax}}
{{PageSyntax}}
:: '''SUB Procedure_name''' [(''parameter''[, ''list''...])]
: [[SUB]] ProcedureName [({{Parameter|1stParam}}[, {{Parameter|2ndParam}} ... [, {{Parameter|lastParam}}]])]
:: ...
: ...
:: ... 'procedure variable definitions and statements
: ... 'procedure variable definitions and statements
:: ...
: ...
:: '''END SUB'''
: [[END SUB]]




{{Parameters}}
{{PageParameters}}
* Parameters passed after the procedure call must match the variable types in the SUB parameters in order.
* Parameters passed after the procedure call must match the variable types in the SUB parameters in order.
* If there are no ''parameter''s passed or they are [[SHARED]] the parameters and parenthesis are not required in the procedure.
* If there are no ''parameter''s passed or they are [[SHARED]] the parameters and parenthesis are not required in the procedure.
Line 25: Line 25:
* [[_DEFINE]] can be used to define all new or old QB64 variable [[TYPE]] definitions instead of DEF***.
* [[_DEFINE]] can be used to define all new or old QB64 variable [[TYPE]] definitions instead of DEF***.
* [[$INCLUDE]] text library files with needed SUB and [[FUNCTION]] procedures can be included in programs after all sub-procedures.
* [[$INCLUDE]] text library files with needed SUB and [[FUNCTION]] procedures can be included in programs after all sub-procedures.
* '''QB64 ignores all procedural DECLARE statements!''' Define all ''parameter'' [[TYPE]]s in the SUB procedure.
* '''QB64 ignores all procedural DECLARE statements.''' Define all ''parameter'' [[TYPE]]s in the SUB procedure.
*  '''Images are not deallocated when the [[SUB]] or [[FUNCTION]] they are created in ends. Free them with [[_FREEIMAGE]].'''
*  '''Images are not deallocated when the [[SUB]] or [[FUNCTION]] they are created in ends. Free them with [[_FREEIMAGE]].'''




''Example 1:'' Text [[PRINT]] screen centering using [[PEEK]] to find the SCREEN mode width. Call and SUB procedure code:
''Example 1:'' Text [[PRINT]] screen centering using [[PEEK]] to find the SCREEN mode width. Call and SUB procedure code:
{{CodeStart}} '' ''
{{CodeStart}}
{{Cl|DEFINT}} A-Z
{{Cl|DEFINT}} A-Z
{{Cl|SCREEN}} 13
{{Cl|SCREEN}} 13
Line 42: Line 42:
Tcol = Middle - ({{Cl|LEN}}(Text$) \ 2)
Tcol = Middle - ({{Cl|LEN}}(Text$) \ 2)
{{Cl|COLOR}} Tclr: {{Cl|LOCATE}} Trow, Tcol: {{Cl|PRINT}} Text$; ' end semicolon prevents screen roll
{{Cl|COLOR}} Tclr: {{Cl|LOCATE}} Trow, Tcol: {{Cl|PRINT}} Text$; ' end semicolon prevents screen roll
{{Cl|END SUB}} '' ''
{{Cl|END SUB}}
{{CodeEnd}}
{{CodeEnd}}


Line 49: Line 49:


''Example 2:'' SUB and [[FUNCTION]] procedures always return to the place they were called in the main or other sub-procedures:
''Example 2:'' SUB and [[FUNCTION]] procedures always return to the place they were called in the main or other sub-procedures:
{{CodeStart}} '' ''
{{CodeStart}}
a = 10
a = 10
Add1 a
Add1 a
Line 74: Line 74:




''See also:''
{{PageSeeAlso}}
* [[FUNCTION]], [[CALL]]
* [[FUNCTION]], [[CALL]]
* [[BYVAL]], [[SCREEN (statement)]]
* [[BYVAL]], [[SCREEN]]
* [[EXIT]], [[END]]
* [[EXIT]], [[END]]




{{PageNavigation}}
{{PageNavigation}}

Latest revision as of 01:12, 29 January 2023

A SUB procedure is a procedure within a program that can calculate and return multiple parameter values just like a full program.


Syntax

SUB ProcedureName [(1stParam[, 2ndParam ... [, lastParam]])]
...
... 'procedure variable definitions and statements
...
END SUB


Parameters

  • Parameters passed after the procedure call must match the variable types in the SUB parameters in order.
  • If there are no parameters passed or they are SHARED the parameters and parenthesis are not required in the procedure.
  • Parameter Variable names in the procedure do not have to match the names used in the CALL, just the value types.


Description

  • All dynamic variable values return to 0 or null strings when the procedure is exited except for STATIC variable values.
  • SUB procedures can return multiple values through the parameters unlike functions.
  • SUB procedures return to the next code statement after the call in the main or other procedures.
  • EXIT SUB can be used to exit early or to exit before GOSUB procedures using RETURN.
  • TYPE and DECLARE LIBRARY declarations can be made inside of SUB procedures in QB64 only.
  • SUB procedures can save program memory as all memory used in a SUB is released on procedure exit except for STATIC values.
  • _DEFINE can be used to define all new or old QB64 variable TYPE definitions instead of DEF***.
  • $INCLUDE text library files with needed SUB and FUNCTION procedures can be included in programs after all sub-procedures.
  • QB64 ignores all procedural DECLARE statements. Define all parameter TYPEs in the SUB procedure.
  • Images are not deallocated when the SUB or FUNCTION they are created in ends. Free them with _FREEIMAGE.


Example 1: Text PRINT screen centering using PEEK to find the SCREEN mode width. Call and SUB procedure code:

DEFINT A-Z
SCREEN 13
Center 10, 15, "This text is centered." ' example module sub call
END

DEFINT A-Z ' only code allowed before SUB line is a DEF statement or a comment
SUB Center (Tclr, Trow, Text$)
Columns = _WIDTH / _FONTWIDTH 'Convert _WIDTH (in pixels) to width in characters
Middle = (Columns \ 2) + 1 ' reads any screen mode width
Tcol = Middle - (LEN(Text$) \ 2)
COLOR Tclr: LOCATE Trow, Tcol: PRINT Text$; ' end semicolon prevents screen roll
END SUB
Explanation: The procedure centers text printed to the screen. The parameters are the text color, row and the text itself as a string or string variable. The maximum width of the screen mode in characters is found and divided in half to find the center point. The text string's length is also divided in half and subtracted from the screen's center position. The procedure will also work when the WIDTH statement has been used. When adding variables to Text$ use the + concatenation operator. Not semicolons!


Example 2: SUB and FUNCTION procedures always return to the place they were called in the main or other sub-procedures:

a = 10
Add1 a
PRINT a  'Add1 returns final 'a' value here

END

SUB Add1 (n)
n = n + 1
Add2 n
PRINT "exit 1"
END SUB

SUB Add2 (m)
m = m + 2
PRINT "exit 2"
END SUB
exit 2
exit 1
 13
Note: Parameter a is used to call the sub-procedures even though parameters n and m are used internally.


See also



Navigation:
Main Page with Articles and Tutorials
Keyword Reference - Alphabetical
Keyword Reference - By usage
Report a broken link