PROGRAM scalare IMPLICIT NONE REAL(8), DIMENSION(:), ALLOCATABLE :: a, b INTEGER :: nd, i, n ! INTERFACE SUBROUTINE inizializza(n,a,b) IMPLICIT NONE REAL(8), DIMENSION(:), ALLOCATABLE, INTENT(INOUT) :: a, b INTEGER, INTENT(INOUT) :: n END SUBROUTINE inizializza SUBROUTINE calcola(a, b) IMPLICIT NONE REAL(8), DIMENSION(:), INTENT(INOUT) :: a, b END SUBROUTINE calcola SUBROUTINE elimina(a, b) IMPLICIT NONE REAL(8), DIMENSION(:), ALLOCATABLE, INTENT(INOUT) :: a, b END SUBROUTINE elimina END INTERFACE ! nd = 1 DO WHILE ( nd > 0 ) PRINT*,"Dimensioni? (negativo per uscire)" READ*,nd CALL inizializza(nd,a,b) ! nd < 0 se errore IF ( nd > 0 ) THEN CALL calcola(a,b) CALL elimina(a,b) ENDIF END DO ! STOP END PROGRAM scalare SUBROUTINE inizializza(nd,a,b) IMPLICIT NONE REAL(8), DIMENSION(:), ALLOCATABLE, INTENT(INOUT) :: a, b INTEGER, INTENT(INOUT) :: nd INTEGER :: st ! ALLOCATE(a(nd), STAT=st) IF ( st /= 0 ) THEN PRINT*,"Errore allocazione matrice A(",nd,")" nd = -1 RETURN ENDIF ALLOCATE(b(nd), STAT=st) IF ( st /= 0 ) THEN PRINT*,"Errore allocazione matrice B(",nd,")" nd = -1 RETURN ENDIF ! a = 1 b = 2 ! RETURN END SUBROUTINE inizializza SUBROUTINE calcola(a,b) IMPLICIT NONE REAL(8), DIMENSION(:), INTENT(INOUT) :: a, b ! ! IF ( ALLOCATED(a) .AND. ALLOCATED(b) ) THEN PRINT*,"Il prodotto scalare di " PRINT*,"A = ",a PRINT*,"B = ",b PRINT*," e' ",DOT_PRODUCT(a,b) ! ENDIF ! RETURN END SUBROUTINE calcola SUBROUTINE elimina(a, b) IMPLICIT NONE REAL(8), ALLOCATABLE, DIMENSION(:), INTENT(INOUT) :: a, b ! IF ( ALLOCATED(a) ) DEALLOCATE(a) IF ( ALLOCATED(b) ) DEALLOCATE(b) ! RETURN END SUBROUTINE elimina