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 [prefix]] SUBROUTINE name [([d-arg-list]) [lang-binding]]

   [specification-part]

   [execution-part]

[CONTAINS

   internal-subprogram-part]

END [SUBROUTINE [name]]

prefix

(Optional) Is any of the following:

  • RECURSIVE

    Permits direct recursion to occur.

  • PURE

    Asserts that the procedure has no side effects.

  • ELEMENTAL

    Acts on one array element at a time. This is a restricted form of pure procedure.

At most one of each of the above can be specified. You cannot specify ELEMENTAL and RECURSIVE together. You cannot specify ELEMENTAL if lang-binding is specified.

name

Is the name of the subroutine.

d-arg-list

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

lang-binding

(Optional) Takes the following form:

BIND (C [, NAME=ext-name])

ext-name

Is a character scalar initialization expression that can be used to construct the external name.

specification-part

Is one or more specification statements, except for the following:

  • INTENT (or its equivalent attribute)

  • OPTIONAL (or its equivalent attribute)

  • PUBLIC and PRIVATE (or their equivalent attributes)

An automatic object must not appear in a specification statement. If a SAVE statement is specified, it has no effect.

execution-part

Is one or more executable constructs or statements, except for ENTRY or RETURN statements.

internal-subprogram-part

Is one or more internal subprograms (defining internal procedures). The internal-subprogram-part is preceded by a CONTAINS statement.

Description

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 BLOCK DATA statement, a PROGRAM statement, or a MODULE statement. A subroutine can contain SUBROUTINE and FUNCTION statements to define internal procedures. 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.

Note that if you specify lang-binding, you have to use the parentheses even if there are no arguments. For example, without lang-binding you can specify SUBROUTINE F but with lang-binding you have to specify SUBROUTINE F( ) BIND (C).

Example

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

See Also