Procedure Pointer Assignments
This section describes procedure pointer assignment. For data pointer assignment see Pointer Assignments.
A procedure pointer has one of three states, undefined, associated, or disassociated. A procedure pointer that is not initialized is undefined until it becomes associated by procedure pointer assignment. Procedure pointer assignment has the following form:
proc_pointer => target_proc
proc_pointer |
Is a procedure pointer. |
proc_target |
Is the name of an external procedure, internal procedure, module procedure, intrinsic procedure, dummy procedure, another procedure pointer, or a reference to the NULL intrinsic function. |
Description
If proc-target is a reference to the NULL intrinsic function, the procedure pointer becomes disassociated. This is equivalent to specifying proc-pointer as a pointer object in a NULLIFY statement. If proc-target is a disassociated procedure pointer, proc-pointer becomes disassociated. If proc-target is an undefined procedure pointer, proc-pointer becomes undefined. If proc-target is a non-pointer dummy argument, proc-pointer becomes associated with the dummy argument’s ultimate argument. If proc-target is an associated procedure pointer, proc-pointer becomes associated with the same procedure. Otherwise, proc-pointer becomes associated with proc-target.
If proc-target is a specific intrinsic name that is also a generic name, proc-pointer becomes associated with only the specific procedure.
The host instance of an associated procedure pointer is the host instance of its target.
If the characteristics of proc-target or proc-pointer require an explicit interface, both proc-target and proc-pointer must have an explicit interface.
If proc-pointer has an explicit interface, its characteristics must be the same as those of proc-target, except proc-target may be pure even if proc-pointer is not pure, and proc-target may be an elemental intrinsic procedure even though proc-pointer cannot be elemental.
proc-target must be a subroutine if proc-pointer is referenced as a subroutine. proc-target must be a function if proc-pointer has an implicit interface and is explicitly typed or referenced as a function. If proc-pointer is a function with an implicit interface, proc-target must have the same type; corresponding type parameters must have the same value.
Examples
Given the following declarations:
INTEGER(KIND=4) :: P_PTR1, P_PTR2, EXT_FUNC PROCEDURE(),POINTER :: P_PTR1, P_PTR2, P_PTR3 EXTERNAL EXT_FUNC
Then the following are examples of procedure pointer assignments:
P_PTR1 => EXT_FUNC
P_PTR2 => P_PTR1
P_PTR3 => NULL()
The following example shows procedure pointer initialization:
INTEGER(KIND=4) :: P_PTR1, P_PTR2, EXT_FUNC
EXTERNAL EXT_FUNC
PROCEDURE(),POINTER :: P_PTR1 => EXT_FUNC, P_PTR3 => NULL()
PROCEDURE(),POINTER :: P_PTR2 => P_PTR1 ! Not valid in initialization; proc_targ must be NULL() or a procedure name
You can use the intrinsic function ASSOCIATED to find out if a pointer is associated, associated with a target, or if two pointers are associated with the same target. For example:
INTEGER(KIND=4) :: P_PTR1, P_PTR2, EXT_FUNC
PROCEDURE(),POINTER :: P_PTR1, P_PTR2, P_PTR3
EXTERNAL EXT_FUNC
P_PTR1 => EXT_FUNC
P_PTR2 => P_PTR1
P_PTR3 => NULL()
PRINT *, ASSOCIATED (P_PTR3) ! Prints .FALSE.
PRINT *, ASSOCIATED (P_PTR1, EXT_FUNC) ! Prints .TRUE.
PRINT *, ASSOCIATED (p_PTR1, P_PTR2) ! Prints .TRUE.