MODULE Tools IMPLICIT NONE TYPE Output INTEGER :: unit=0 CHARACTER(80) :: filename="" END TYPE Output INTERFACE ASSIGNMENT(=) MODULE PROCEDURE PrintM_R8, PrintM_I4 END INTERFACE INTERFACE Activate MODULE PROCEDURE ActivateOutput END INTERFACE Activate CONTAINS SUBROUTINE ActivateOutput(d) IMPLICIT NONE TYPE(Output), INTENT(IN) :: d LOGICAL :: opnd IF ( d%unit == 0 .OR. d%unit == 6 ) RETURN INQUIRE(d%unit,OPENED=opnd) IF ( opnd ) RETURN OPEN(d%unit,FILE=TRIM(d%filename)) RETURN END SUBROUTINE ActivateOutput SUBROUTINE PrintM_R8(dev,m) IMPLICIT NONE TYPE(Output), INTENT(INOUT) :: dev REAL(8), DIMENSION(:,:), INTENT(IN) :: m INTEGER :: u, i, j CALL Activate(dev) u = dev%unit if ( u <= 0 ) u = 6 DO i = 1, SIZE(m,1) DO j = 1, SIZE(m,2) WRITE(u,"(F12.4,1X)",ADVANCE="NO") m(i,j) END DO WRITE(u,"(/)") END DO RETURN END SUBROUTINE PrintM_R8 SUBROUTINE PrintM_I4(dev,m) IMPLICIT NONE TYPE(Output), INTENT(INOUT) :: dev INTEGER, DIMENSION(:,:), INTENT(IN) :: m INTEGER :: u, i, j CALL Activate(dev) u = dev%unit if ( u <= 0 ) u = 6 DO i = 1, SIZE(m,1) DO j = 1, SIZE(m,2) WRITE(u,"(I12,1X)",ADVANCE="NO") m(i,j) END DO WRITE(u,"(/)") END DO RETURN END SUBROUTINE PrintM_I4 END MODULE Tools PROGRAM Test USE Tools IMPLICIT NONE TYPE(Output) :: video=Output(0), file=Output(11,"Matrice.txt") REAL(8), DIMENSION(6,4) :: A INTEGER, DIMENSION(6,4) :: IA INTEGER :: i, j, wu DO i = 1, 6 DO j = 1, 4 A(i,j) = DBLE(i-j)*10.0/DBLE(i+j) END DO END DO WRITE(*,*) "Stampa di matrice R(8):" video = A IA = A WRITE(*,*) "Stampa di matrice I(4):" video = IA DO i = 1, 6 DO j = 1, 4 A(i,j) = i*10+j END DO END DO WRITE(*,*) "Stampa di matrice R(8) su file:" file = A STOP "Fine esecuzione" END PROGRAM Test