next up previous

Subprograms


  • Generalità
  • Così come il fortran 77, il fortran 90 tiene conto di due tipi di subprograms: (1) funzioni e (2) subroutine. In generale, ci sono due forme di subprograms: interni ed esterni. I subprograms interni sono quelle procedure che possono comparire nell'ambito del programma principale, in questo caso il subprogram vede tutte le variabili presenti nel programma che li contiene. Il costrutto per l'inserimento di una routine all'interno di un altro programma è il seguente: program prova ............. ............. call sub(a,b,c) !Chiamata alla subroutine ............. contains subroutine sub(a,b,c) ............. ............. end subroutine sub end program prova I subprograms esterni sono quelli che compaiono in una sezione separata di programma dopo l' istruzione principale di END di programma. Ciò è molto simile alle pratiche che già abbiamo incontrato in fortran 77. Inoltre, così come in fortran 77, i subprograms del tipo function in fortran 90 hanno un tipo esplicito e sono indirizzati a restituire un valore.I subprograms del tipo subroutine, d'altra parte, non hanno tipo esplicito e restituiscono il multiplo o nessun valore con una chiamata di parametro CONTAINS(). Poiché metteremo a fuoco i subprograms esterni, è essenziale l'utilizzo di una caratteristica del fortran 90 conosciuta come INTERFACE BLOCKS.Questo blocco è una caratteristica di sicurezza che permette che i programmi principali ed i subprograms esterni si connettano giustamente. Un INTERFACE BLOCKS si accerta che il programma chiamante ed il subprogram abbiano il numero ed il tipo corretti di argomenti. Ciò aiuta il compilatore a rilevare l'uso errato d'un subprogram . Un INTERFACE BLOCK consiste di: 1. Il numero di argomenti 2. il tipo di ogni argomento 3. che tipo del value(s) ha restituito il subprogram Richiameremo le varie funzioni dei subprograms attraverso alcuni esempi.
  • Function
  • Come esempio d'un programma che usa una Function, consideriamo quanto segue: 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) ! !--------------------------------------------------------------------- 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 di funzione funziona allo stesso modo del subprogram di funzione in 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.
  • Subroutine
  • Un esempio di subroutine di fortran 90 è fornito qui sotto: !TRASFORMATA DI FOURIER DISCRETA !________________________________ subroutine dft (A,N,E) implicit none integer :: N !numero di campioni integer :: E !numero di campinature effettuate integer :: i,j !indice di riga e di colonna della matrice complex :: uim !unita' immaginaria complex,dimension(0:1000,0:1000) :: A !matrice complessa uim=(0,1) do i=0, n-1 do j=0, n-1 A(i,j)=exp(-(2*3.14*uim*i*j)/n) end do end do E=N end Questa subroutine calcola le trasformate discrete di fourier dato un certo campione. Nella subroutine vista,le caratteristiche principali sono rappresentate dai parametri di scambio,presenti a fianco al nome della subroutine e nella chiamata del programma principale.Devono essere posti nello stesso ordine ma possono essere indicati anche con nomi diversi;all'interno della subroutine devono essere definiti nuovamente.
  • Subprograms ricorsivi
  • Il fortran 90, come nel caso del fortran 77, permette l'uso dei subprograms ricorsivi. Come esempio di una funzione ricorsiva consideriamo la seguente: RECURSIVE FUNCTION factorial(n) RESULT(res) INTEGER res, n IF(n.EQ.1) THEN res = 1 ELSE res = n*factorial(n-1) END IF END