Le funzioni nel Fortran


FORTRANLe funzioni, nel Fortran, rappresentano un tipo di sottoprogrammi che, se necessario, possono essere richiamati più volte all’interno del programma principale per soddisfare una particolare esigenza ed effettuare degli opportuni calcoli.

Le funzioni definite dall’utente, a differenza delle funzioni standard già ingoblate nell’ambiente di programmazione, vengono scritte al fine di soddisfare uno specifico scopo che nessun altro strumento a disposizione del programmatore è in grado di soddisfare.

Le funzioni sono definite attraverso un costrutto del tipo:

FUNCTION Area_Circle(r) USE Circle, ONLY : Pi
IMPLICIT NONE
REAL :: Area_Circle
REAL, INTENT(IN) :: r
Area_Circle = Pi * r * r
END FUNCTION Area_Circle

È tramite il nome della funzione che si richiama la funzione all’interno del programma principale. Gli argomenti contenuti nelle parentesi tonde sono gli identificatori su cui la funzione opera.

Le funzioni lavorano sui valori memorizzati negli argomenti e restituiscono un risultato del tipo specificato. L’elenco degli identificatori costituisce un insieme di oggetti fittizi, ai quali, quando il sottoprogramma viene richiamato, vengono rimpiazzati i valori degli argomenti dell’istruzione chiamante.

Dopo la definizione della una funzione, csegue il blocco di istruzioni che costituiscono il sottoprogramma. Tra queste vi deve essere almeno un’istruzione di assegnazione con il nome della funzione a sinistra del segno di uguale, che assegna un valore a questa variabile e che viene quindi restituito al programma chiamante al termine della funzione, che come tutti i programmi deve terminare con END.

Vediamo come esempio un programma che richiama al suo interno una funzione:

MODULE Circle
!---------------------------------------------------------------------
! ! Modulo che contiene la definizione delle variabili necessarie
! per la computazione dell'area del cerchio di raggio r !
!---------------------------------------------------------------------
REAL, PARAMETER :: Pi = 3.1415927
REAL :: radius
END MODULE Circle
PROGRAM Area
!---------------------------------------------------------------------
! ! Questo programma computa l'area del cerchio dato il raggio !
! Uses: MODULE Circle ! FUNCTION Area_Circle (r) !
!---------------------------------------------------------------------
16
USE Circle, ONLY : radius IMPLICIT NONE
INTERFACE
FUNCTION Area_Circle (r)
REAL, INTENT(IN) :: r
END FUNCTION Area_Circle
END INTERFACE
! Prompt user per il raggio del cerchio write(*, '(A)', ADVANCE =
"NO") "Digita il raggio del cerchio: " read(*,*) radius
! Write out area of circle using function call write(*,100) "Area
del cerchio con raggio", radius, " is", &
Area_Circle(radius)
100 format (A, 2x, F6.2, A, 2x, F11.2)
END PROGRAM Area
!-----Area_Circle----------------------------------------------------
! ! Funzione che calcola l'area del cerchio di raggio r !
!---------------------------------------------------------------------
FUNCTION Area_Circle(r) USE Circle, ONLY : Pi
IMPLICIT NONE REAL :: Area_Circle REAL, INTENT(IN) :: r
Area_Circle = Pi * r * r
END FUNCTION Area_Circle

Questo programma usa la funzione Area_Circle per computare l’area d’un cerchio di raggio r. La funzione compare dopo l’istruzione di fine programma della zona principale di programma, in modo da essere classificata come subprogram esterno. Poichè è una procedura esterna, il programma principale usa un INTERFACE BLOCK per definire tutti i parametri richiesti dalla funzione Area_Circle.

La versione in fortran 90 del subprogram funzione si comporta allo stesso modo del subprogram funzione presente nel fortran 77. Si noti che l’ unica differenza sostanziale qui è la capacità di dichiarare esplicitamente gli argomenti della funzione in se.Prendere la nota speciale del descrittore INTENT(IN) del tipo.

Questo attributo della variabile r nel subprogram di funzione identifica rigorosamente la variabile r come variabile di input. Tali variabili non possono essere modificati dal subprogram in modo involontario.

LINK DI APPROFONDIMENTO PER L’ARGOMENTO:

Leave a Reply

Your email address will not be published. Required fields are marked *