## 6.2.3 Subroutine Subprograms: SUBROUTINE Statement

A subroutine subprogram is a program unit consisting of a SUBROUTINE statement followed by a series of statements that define a computing procedure. The CALL statement transfers control to a subroutine subprogram; a RETURN or END statement returns control to the calling program unit.

SUBROUTINE statements take the following form:

    SUBROUTINE sub [([p [,p] . . . ])]

sub
  Is the symbolic name of the subroutine.
p
  Is a dummy argument. An asterisk (*) in the argument list specifies a dummy argument as an alternate return argument.

When control transfers to the subroutine, the values of any actual arguments in the CALL statement are associated with any corresponding dummy arguments in the SUBROUTINE statement. The statements in the subprogram are then executed.

The SUBROUTINE statement must be the first statement of a subroutine, unless an OPTIONS statement is specified.

A subroutine subprogram cannot contain a FUNCTION statement, a BLOCK DATA statement, a PROGRAM statement, or another SUBROUTINE statement. ENTRY statements are allowed to specify multiple entry points in the subroutine.

Examples

The first example contains a subroutine that computes the volume of a regular polyhedron, given the number of faces and the length of one edge. It uses the computed GO TO statement to determine whether the polyhedron is a tetrahedron, cube, octahedron, dodecahedron, or icosahedron. The GO TO statement also transfers control to the proper procedure for calculating the volume. If the number of faces is not 4, 6, 8, 12, or 20, the subroutine sends an error message to the terminal.

    Main Program

    COMMON NFACES, EDGE, VOLUME

    ACCEPT *, NFACES, EDGE

    CALL PLYVOL

    TYPE *, 'VOLUME=', VOLUME

    STOP

    END

    Subroutine

          SUBROUTINE PLYVOL

          COMMON NFACES, EDGE, VOLUME

          CUBED = EDGE**3

          GO TO (6,6,6,1,6,2,6,3,6,6,6,4,6,6,6,6,6,6,6,5), NFACES

          GO TO 6

    1     VOLUME = CUBED * 0.11785

          RETURN

    2     VOLUME = CUBED

          RETURN

    3     VOLUME = CUBED * 0.47140

          RETURN

    4     VOLUME = CUBED * 7.66312

          RETURN

    5     VOLUME = CUBED * 2.18170

          RETURN

    6     TYPE 100, NFACES

    100   FORMAT (' NO REGULAR POLYHEDRON HAS ',I3,'FACES.'/)

          VOLUME = 0.0

          RETURN

          END

The next example uses alternate return specifiers to determine where control transfers on completion of the subroutine. 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 decision about which RETURN statement executes depends on the value of Z, as computed in the subroutine:

- If Z is less than zero, the normal return executes.

- If Z is equal to zero, the return is to statement label 10 in the main program.

- If Z is greater than zero, the return is to statement label 20 in the main program.

    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

        ...

For More Information:

- On the CALL statement, see Section 5.1.

- On the ENTRY statement, see Section 6.2.4.

Previous Page Next Page Table of Contents