Unità di programma: Interface

I blocchi INTERFACE servono a descrivere le modalità di chiamata ad una subroutine o una function.
  • Un'INTERFACE consiste in una ripetizione in miniatura delle istruzioni dichiarative di un sottoprogramma e dei suoi parametri di chiamata
  • essa permette al compilatore di controllare il numero e il tipo degli argomenti e il loro INTENT e segnalare eventuali discrepanze
  • permette il passaggio di argomenti opzionali e di tipo keyword che vedremo tra pochissimo
  • permette il passaggio degli array f90 assumed shape, e altre amenità del genere che verranno viste in seguito
  • l'INTERFACE ad un sottoprogramma chiamato, per essere efficace, deve essere nota all'unità di programma chiamante (in gergo deve essere nel suo scope), e ciò avviene nei seguenti 3 casi:
    • l'unità di programma chiamante può ospitare un blocco INTERFACE tra le sue istruzioni dichiarative
    • tutti i sottoprogrammi interni ad un modulo ereditano eventuali blocchi INTERFACE contenuti nelle istruzioni dichiarative del modulo stesso (prima del CONTAINS)
    • tutte le unità di programma che fanno USE di un modulo ereditano eventuali blocchi INTERFACE contenuti nelle istruzioni dichiarative del modulo stesso
PROGRAM intfc
IMPLICIT NONE

INTERFACE
  SUBROUTINE calcola(a, b, c, d)
  REAL :: a, b, c, d
  END SUBROUTINE calcola
END INTERFACE


INTEGER :: i, j, k
REAL :: x, y, z, v

CALL calcola(x, y ,z, v) ! Buona
CALL calcola(x, y ,z) ! Errore in compilazione
CALL calcola(i, j, k, v) ! Errore in compilazione


END PROGRAM intfc

SUBROUTINE calcola(a, b, c, d)
REAL :: a, b, c, d

d = SQRT(a**2 + b**2 + c**2)

END SUBROUTINE calcola

L'uso dell'INTERFACE come visto ora (interfaccia esplicita) è in realtà decisamente scomodo perché: Ci viene però in aiuto il fatto che, quando facciamo USE di un MODULE, otteniamo automaticamente un'INTERFACE implicita, aggiornata e gratuita a tutti i sottoprogrammi contenuti nel modulo stesso. Se inoltre anche i sottoprogrammi chiamanti sono organizzati come un modulo, è sufficiente fare USE una volta sola all'inizio del modulo anziché ripeterlo per ogni sottoprogramma, con evidenti vantaggi.
Anche per i sottoprogrammi interni, il compilatore fornisce all'unità di programma che li contiene un'interfaccia implicita.