Il seguente programma proc.f90 contiene due funzioni e una procedura.
PROGRAM prova IMPLICIT NONE WRITE (*,*) prima(), seconda(8,2) CALL esempio(15) STOP CONTAINS FUNCTION prima() INTEGER :: prima INTEGER :: a a=10 prima=12-a RETURN END FUNCTION prima FUNCTION seconda(x, y) INTEGER, INTENT(in) :: x, y INTEGER :: seconda seconda=x+y+10 RETURN END FUNCTION seconda SUBROUTINE esempio(w) INTEGER, INTENT(in) :: w WRITE (*,*) w+10 RETURN END SUBROUTINE esempio END PROGRAM prova
Analizziamo questo programma. Per prima cosa, eliminando tutte le istruzioni, si vede che la struttura è la seguente:
PROGRAM prova (istruzioni del programma, fino a STOP) CONTAINS FUNCTION prima() (istruzioni della funzione) END FUNCTION prima FUNCTION seconda(x, y) (istruzioni della funzione) END FUNCTION seconda SUBROUTINE esempio(w) (istruzioni della procedura) END SUBROUTINE esempio END PROGRAM prova
In altre parole, dopo lo STOP del programma ma prima di END PROGRAM appare CONTAINS seguito dalle due funzioni e dalla procedura. Ognuna delle due funzioni inizia con FUNCTION nome e termina con END FUNCTION nome.
La prima funzione ha un valore di ritorno ma non ha argomenti:
FUNCTION prima() INTEGER :: prima INTEGER :: a a=10 prima=12-a RETURN END FUNCTION prima
All'interno della funzione va dichiarata una variabile con lo stesso nome della funzione stessa, in questo caso prima:
Notare anche che la funzione termina con RETURN invece che con STOP.
La seconda funzione ha due argomenti: x e y. Notare come i tipi di questi argomenti vengono dichiarati all'interno della funzione, e non nella sua intestazione.
FUNCTION seconda(x, y) INTEGER, INTENT(in) :: x, y INTEGER :: seconda seconda=x+y+10 RETURN END FUNCTION seconda
La parte INTENT(in) va messa per indicare che queste non sono variabili locali della funzione ma argomenti.
L'ultima parte del programma è la procedura, ossia una funzione che non ha un valore di ritorno. Questa particolare procedura ha un argomento w di tipo intero. Non va dichiarata la variabile esempio dal momento che le procedure non hanno valore di ritorno.
SUBROUTINE esempio(w) INTEGER, INTENT(in) :: w WRITE (*,*) w+10 RETURN END SUBROUTINE esempio
Per quello che riguarda il programma, le funzioni si chiamano come al solito, ossia scrivendo il nome della funzione con gli argomenti fra parentesi. Le procedure devono essere invece precedute da CALL.
PROGRAM prova IMPLICIT NONE WRITE (*,*) prima(), seconda(8,2) CALL esempio(15) STOP CONTAINS ... END PROGRAM prova
Per esempio, dato che prima è una funzione con valore di ritorno intero, si può scrivere prima() in ogni punto del programma dove va scritto un intero. Lo stesso vale per seconda, che essendo però una funzione con due argomenti interi, va chiamata come seconda(espressione1, espressione2), dove le due espressioni devono ritornare un valore intero.
La procedura esempio viene chiamata con CALL esempio(15). In altre parole, per chiamare le procedure (ma non le funzioni) va scritta prima la parola CALL.