The following program has the subroutines sub1 and sub2 encapsulated into the module,
MODULE related_procedures ! INTERFACEs of MODULE PROCEDURES do ! not need to be specified they are ! 'already present' CONTAINS SUBROUTINE sub1(A,B,C) ! Can see Sub2's INTERFACE ... END SUBROUTINE sub1 SUBROUTINE sub2(time,dist) ! Can see Sub1's INTERFACE ... END SUBROUTINE sub2 END MODULE related_procedures PROGRAM use_of_module USE related_procedures CALL sub1((/1.0,3.141,0.57112/),2,'Yobot') CALL sub2(t,d) END PROGRAM use_of_module
the interfaces of all module procedures are visible to all other modules procedures in the same module, this means, sub1 can call sub2 or vice versa and there is no need for any additional INTERFACE declarations to be typed in.
Consider the following erroneous code,
MODULE Schmodule CONTAINS LOGICAL FUNCTION bool(y,z) INTEGER, INTENT(IN) :: y, z bool = .FALSE. IF (y > z) bool = .TRUE. END FUNCTION bool SUBROUTINE subby(x,y,z) INTEGER, INTENT(IN) :: y, z INTEGER, INTENT(OUT) :: x ! next line is error LOGICAL :: bool ! if ( bool(y,z) ) x = 1 END SUBROUTINE subby END MODULE Schmodule
Both procedures are visible to one another by host association so in subby the intention of declaring the other module procedure is misguided. The LOGICAL FUNCTION bool is already visible to subby but due to the declaration is superseded by a local LOGICAL object called bool. When the module is compiled a complaint is made that the external function bool is missing.
Return to corresponding overview page