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.