 |
» |
|
|
 |
Provides an additional external or module subprogram entry
point. SyntaxENTRY entry-name [([dummy-arg-list]) |
- entry-name
is the name of the entry point (subroutine or function)
defined by the ENTRY statement. It must differ from the original subroutine
or function name, and from other ENTRY statement entry-names specified in the subprogram in which it appears. - dummy-arg-list
is a comma-separated
list of dummy arguments for the subroutine or function defined by
the ENTRY statement. The same rules and restrictions apply
as for subroutine dummy arguments or function dummy arguments, as
appropriate. - result-name
is the result variable for a function defined by
an ENTRY statement. result-name is optional; if not specified, the result variable
is entry-name. The RESULT (result-name) clause can only be specified when the ENTRY statement is included in a function subprogram.
DescriptionWhen
an ENTRY statement appears in a function subprogram, it
effectively provides an additional FUNCTION statement in the subprogram: execution starts
from the ENTRY statement when the entry-name is invoked (by being used). Similarly, an ENTRY statement in a subroutine subprogram effectively
provides an additional SUBROUTINE statement in the subprogram, and execution starts
from the ENTRY statement when the entry-name is called. The following restrictions apply to the ENTRY statement: The ENTRY statement can appear in an external subprogram
or a module subprogram; it may not appear in an internal subprogram.
If the ENTRY statement appears in a function subprogram, it
defines an additional function; if it appears in a subroutine subprogram,
it defines an additional subroutine. The entry points thus defined
can be referenced in the same way as for a normal function name
or subroutine name, as appropriate. Execution starts at the ENTRY statement, and continues in the normal manner,
ignoring any ENTRY statements subsequently encountered, until a RETURN statement or the end of the procedure is reached. The RESULT (result-name) clause can only be specified when the ENTRY statement is included in a function subprogram.
If specified, result-name must differ from entry-name, and entry-name must not appear in any specification statement in
the scoping unit of the function subprogram; entry-name assumes all the attributes of result-name. The RESULT clause in an ENTRY statement has the same syntax and semantics as
in a FUNCTION statement. If the ENTRY statement appears in a function, the result variable
is that specified in the FUNCTION statement; if none is specified, the result variable
is entry-name. If the characteristics
of the result variable specified in the ENTRY statement are the same as those of the result
variable specified in the FUNCTION statement, then the result variable is the same,
even though the names are different. If the characteristics are different,
then the result variables must be: Nonpointer scalars of intrinsic type If any is of character type, they must all be of
character type and must all have the same length. If any is of noncharacter
type, they must all be of noncharacter type.
The result variable
may not appear in a COMMON, DATA, or EQUIVALENCE statement. Also, the result variable may not have
the ALLOCATABLE, INTENT, OPTIONAL, PARAMETER, or SAVE attribute. If RECURSIVE is specified on the FUNCTION statement at the start of a function subprogram,
and RESULT is specified on an ENTRY statement within the subprogram, then the interface
of the function defined by the ENTRY statement is explicit within the function subprogram;
the function can thus be invoked recursively. (Note that the keyword RECURSIVE is not given on the ENTRY statement, but only on the FUNCTION statement.) If RECURSIVE is specified on the SUBROUTINE statement at the start of a subroutine subprogram,
the interface of the subroutine defined by an ENTRY statement within the subprogram is explicit within
the subprogram; the subroutine can thus be called recursively. A dummy argument
in an ENTRY statement must not appear in an executable statement preceding
the ENTRY statement, unless it also appears in a FUNCTION, SUBROUTINE, or ENTRY statement preceding the executable statement. If a dummy argument in a subprogram—that
is, as specified in a FUNCTION or SUBROUTINE statement at the start of the subprogram or in
any ENTRY statements within the subprogram—is used
in an executable statement, then the statement may only be executed
if the dummy argument appears in the dummy argument list of the
procedure name actually referenced in the current call. The same
restrictions apply when you use a dummy argument in a specification
expression to specify an array bound or character length. A procedure defined
by an ENTRY statement may be given an explicit interface by
use of an INTERFACE block. The procedure header in the interface body
must be a FUNCTION statement for an entry to a function subprogram,
and a SUBROUTINE statement for an entry to a subroutine subprogram.
The ENTRY statement was often used in FORTRAN 77 programs
in situations where a set of subroutines or functions had slightly
different dummy argument lists but entailed computations involving
identical data and code. In Fortran 90 the use of the ENTRY statement in such situations can be replaced by
the use of optional arguments. ExamplesThe following example defines a subroutine subprogram with
two dummy arguments. The subprogram also contains an ENTRY statement that takes only the first dummy argument specified
in the SUBROUTINE statement. SUBROUTINE Full_Name (first_name, surname) CHARACTER(20) :: first_name, surname ... ENTRY Part_Name (first_name) |
The following example
creates a stack. It shows the use of ENTRY to group the definition of a data structure together
with the code that accesses it, a technique known as encapsulation. (This
example could alternatively be programmed as a module, which would
be preferable in that it does not rely on storage association.) SUBROUTINE manipulate_stack IMPLICIT NONE INTEGER size, top /0/, value PARAMETER (size = 100) INTEGER, DIMENSION(size) :: stack SAVE stack, top ENTRY push(value) ! Push value onto the stack IF (top == size) STOP 'Stack Overflow' top = top + 1 stack(top) = value RETURN ENTRY pop(value) ! Pop top of stack and place in value IF (top == 0) STOP 'Stack Underflow' value = stack(top) top = top - 1 RETURN END SUBROUTINE manipulate_stack |
Here are examples of CALL statements associated with the preceding example: CALL push(10) CALL push(15) CALL pop(I) CALL pop(J) |
Related statementsFUNCTION, SUBROUTINE, and CALL Related conceptsFor information about external procedures, see “External
procedures”.
|