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] . . . ])]
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.
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:
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 ...