SUBROUTINE

Statement: The initial statement of a subroutine subprogram. A subroutine subprogram is invoked in a CALL statement or by a defined assignment statement, and does not return a particular value.

Syntax

[prefix] SUBROUTINE name [([d-arg-list])]

prefix
(Optional) Is one of the following:

type [keyword]
keyword [type]

type
Is a data type specifier.

keyword
Is one of the following:

Keyword  Meaning 
RECURSIVE Permits direct recursion to occur.
PURE Asserts that the procedure has no side effects.
ELEMENTAL Restricted form of pure procedure that acts on one array element at a time.

name
Is the name of the subroutine.

d-arg-list
Is a list of one or more dummy arguments or alternate return specifiers (*).

Rules and Behavior

A subroutine is invoked by a CALL statement or defined assignment. When a subroutine is invoked, dummy arguments (if present) become associated with the corresponding actual arguments specified in the call.

Execution begins with the first executable construct or statement following the SUBROUTINE statement. Control returns to the calling program unit once the END statement (or a RETURN statement) is executed.

A subroutine subprogram cannot contain a FUNCTION statement, a BLOCK DATA statement, a PROGRAM statement, or another SUBROUTINE statement. ENTRY statements can be included to provide multiple entry points to the subprogram.

You need an interface block for a subroutine when:

If the subroutine is in a DLL and is called from your program, use the option DLLEXPORT or DLLIMPORT, which you can specify with the ATTRIBUTES directive.

Compatibility

CONSOLE STANDARD GRAPHICS QUICKWIN GRAPHICS WINDOWS DLL LIB

See Also: FUNCTION, INTERFACE, PURE, ELEMENTAL, CALL, RETURN, ENTRY, Argument Association, Program Units and Procedures, General Rules for Function and Subroutine Subprograms, Obsolescent and Deleted Language Features

Examples

The following example shows a subroutine:

Main Program          Subroutine
CALL HELLO_WORLD      SUBROUTINE HELLO_WORLD
...                   PRINT *, "Hello World"
END                   END SUBROUTINE

The following example uses alternate return specifiers to determine where control transfers on completion of the subroutine:

Main Program                          Subroutine
    CALL CHECK(A,B,*10,*20,C)             SUBROUTINE CHECK(X,Y,*,*,Q)
    TYPE *, 'VALUE LESS THAN ZERO'        ...
    GO TO 30                          50  IF (Z)  60,70,80
10  TYPE*, 'VALUE EQUALS ZERO'        60  RETURN
    GO TO 30                          70  RETURN 1
20  TYPE*, 'VALUE MORE THAN ZERO'     80  RETURN 2
30  CONTINUE                              END
    ...

The SUBROUTINE statement argument list contains two dummy alternate return arguments corresponding to the actual arguments *10 and *20 in the CALL statement argument list.

The value of Z determines the return, as follows:

(An alternate return is an obsolescent feature in Fortran 90 and Fortran 95.)

The following shows another example:

     SUBROUTINE GetNum (num, unit)
     INTEGER num, unit
 10  READ (unit, '(I10)', ERR = 10) num
     END