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
...