SUBR() |
![]() ![]() ![]() |
The SUBR() function calls a subroutine as a function in an expression. It is normally only used in dictionary I-type items.
Format
SUBR(name {,arg1 {, arg2...})
where
The SUBR() function calls catalogued subroutine name, passing arg1, arg2, etc to it as its arguments. The subroutine must be written to have an additional first argument through which it returns its result which is used as the value of the SUBR() function.
A statement such as
A = B + SUBR("EVALUATE", C, D)
is equivalent to
CALL EVALUATE(X, C, D) A = B + X
The name argument may be any expression that evaluates to the name of the subroutine. The catalogue look-up process is performed for each execution of the SUBR() function unlike a CALLstatement where the look-up is performed just once for each invocation of the calling program.
When used in a QMBasic program, the SUBR() function does not support the MAT keyword to pass a whole matrix as an argument. The CALL statement must be used to achieve this.
Example
SUBROUTINE CUST.ORD(RESULT, CUST.NO) $INCLUDE FILES.H SELECTINDEX 'CUST', CUST.NO FROM ORDERS.F TO 1 READLIST RESULT FROM 1 ELSE NULL RETURN END
The above subroutine takes a customer number as its second argument and uses this to access an alternate key index, returning a list of all orders that were placed by the given customer. This example assumes that the ORDERS.F file variable is in a common block defined in the FILES.H include record and that the file is already open.
The subroutine could alternatively be written as a function: FUNCTION CUST.ORD(CUST.NO) $INCLUDE FILES.H SELECTINDEX 'CUST', CUST.NO FROM ORDERS.F TO 1 READLIST RESULT FROM 1 ELSE NULL RETURN RESULT END
In either case, assuming that the subroutine or function is catalogued as CUST.ORD, it could be used from within a dictionary I-type item by use of a SUBR() function such as: SUBR('CUST.ORD', CUST.NO) where CUST.NO is the name of a field within the data records being processed. |