Le procedure

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.