MODULE dati IMPLICIT NONE TYPE, PUBLIC :: doppio INTEGER :: n, v END TYPE doppio INTERFACE SUBROUTINE incrementa(n,d) IMPORT :: doppio IMPLICIT NONE INTEGER, OPTIONAL, INTENT(IN) :: n TYPE(doppio), INTENT(INOUT) :: d END SUBROUTINE incrementa END INTERFACE CONTAINS SUBROUTINE inizializza(o) IMPLICIT NONE TYPE(doppio), INTENT(INOUT) :: o ! IF ( o%v < 10000 ) then CALL incrementa(D=o) ELSE o%v = 0; o%n = 1 ENDIF ! RETURN END SUBROUTINE inizializza SUBROUTINE stampa(n,o) IMPLICIT NONE CHARACTER(*) :: n TYPE(doppio), INTENT(IN) :: o ! PRINT*,n,"%n = ",o%n," ",n,"%v = ",o%v ! RETURN END SUBROUTINE stampa END MODULE dati PROGRAM importa USE dati IMPLICIT NONE TYPE(doppio) :: a ! CALL inizializza(a) CALL stampa("a",a) ! STOP END PROGRAM importa SUBROUTINE incrementa(n,d) USE dati IMPLICIT NONE INTEGER, OPTIONAL, INTENT(IN) :: n TYPE(doppio), INTENT(INOUT) :: d INTEGER :: q ! IF ( PRESENT(n) ) THEN q = n ELSE q = 2 END IF ! IF ( q >= 1 ) THEN d%n = d%n + 1 END IF IF ( q >= 2 ) THEN d%v = d%v + 2 END IF ! RETURN END SUBROUTINE incrementa