MODULE libr CONTAINS FUNCTION addvet(a,b,n) IMPLICIT NONE ! Allocazione automatica: nessun controllo INTEGER, INTENT(IN) :: n REAL(8), DIMENSION(n), INTENT(IN) :: a, b REAL(8), DIMENSION(n) :: addvet ! INTEGER :: i ! DO i = 1, n addvet(i) = a(i) + b(i) END DO ! RETURN END FUNCTION addvet ! FUNCTION addvetp(a,b,n,f) IMPLICIT NONE ! Allocazione dinamica con sinonimo INTEGER, INTENT(IN) :: n INTEGER, INTENT(OUT) :: f REAL(8), DIMENSION(n), INTENT(IN) :: a, b REAL(8), DIMENSION(:), POINTER :: addvetp ! INTEGER :: i, st ! ALLOCATE(addvetp(n), STAT=st) IF ( st /= 0 ) THEN PRINT*,"In ADDVETP errore allocazione risultato" f = -1 RETURN END IF f = 1 DO i = 1, n addvetp(i) = a(i) + b(i) END DO ! RETURN END FUNCTION addvetp ! FUNCTION addveta(a,b,n,f) IMPLICIT NONE ! Allocazione dinamica stile Fortran 2003 INTEGER, INTENT(IN) :: n INTEGER, INTENT(OUT) :: f REAL(8), DIMENSION(n), INTENT(IN) :: a, b REAL(8), DIMENSION(:), ALLOCATABLE :: addveta ! INTEGER :: i, st ! ALLOCATE(addveta(n), STAT=st) IF ( st /= 0 ) THEN PRINT*,"In ADDVETA errore allocazione risultato" f = -1 RETURN END IF ! f = 1 DO i = 1, n addveta(i) = a(i) + b(i) END DO ! RETURN END FUNCTION addveta END MODULE libr PROGRAM sommav USE libr IMPLICIT NONE REAL(8), DIMENSION(1000) :: a, b, c REAL(8) :: v, w INTEGER :: st ! PRINT*,"Valore elementi di A(:) e B(:):" READ*,v, w a = v; b = w c = addvet(a, b, 1000) PRINT*,"C(1:10) = ",c(1:10) c = addvetp(a, b, 1000, st) IF ( st > 0 ) THEN PRINT*,"C(1:10) = ",c(1:10) END IF c = addveta(a, b, 1000,st) IF ( st > 0 ) THEN PRINT*,"C(1:10) = ",c(1:10) END IF STOP END PROGRAM sommav