Interfacce nel Fortran


FORTRANIn questo articolo vedremo come utilizzare le interfacce nel Fortran per definire un sottoprogramma. Le interfacce sono necessarie per definire un sottoprogramma generico. L’ interfaccia è  un blocco di istruzioni non eseguibili  che serve a informare il compilatore sui tipi dati e numero degli argomenti dei sottoprogrammi utilizzati, in mdo che eventuali  utilizzi incoerenti (numero di argomenti diverso,  tipi dati differenti)  possa essere segnalato al momento della compilazione.

La sintassi per definire un blocco interfaccia è la seguente:

interface
...
end interface

al cui interno vanno inseriti i soli blocchi di dichiarazione dei sottoprogrammi e dei rispettivi argomenti. Non vanno messe nell’ interfaccia né  le dichiarazioni di variabili locali né  le istruzioni eseguibili dei sottoprogrammi.
In un blocco interfaccia si possono collocare le dichiarazioni relative a più  sottoprogrammi. Si possono anche avere più  blocchi interfaccia nella stessa unità  di programma.

Le interfacce nel Fortran riferiscono la specifica conoscenza che il compilatore ha circa una procedura durante la sua compilazione. Se l’interfaccia è esplicita, il compilatore può verificare che il sottoprogramma venga richiamato correttamente. Se, tuttavia, l’interfaccia è implicita, il compilatore Fortran 90 non dispone di informazioni sui tipi e numero di argomenti utilizzati dal sottoprogramma o il valore di ritorno del risultato di una funzione.

La Tipizzazione implicita viene utilizzata nel programma chiamante per determinare il risultato restituito da una funzione, nel caso in cui non si disponga della dichiarazione. Di conseguenza, nessun tipo di controllo può essere fatto per verificare che un sottoprogramma è stato chiamato correttamente. Diremo allora implicite tutte le interfacce che sono disponibili nel Fortran 77.

Ad esempio la funzione sin (x)  calcola, in modo appropriato, il seno del suo argomento, se x è singola o in doppia precisione, oppure un numero reale o complesso. In Fortran 90, i sottoprogrammi definiti dall’utente possono essere generici nello stesso senso. Le funzioni generiche e le subroutine possono essere definiti, analogamente a qualsiasi altro sottoprogramma, anche se l’interfaccia deve essere esplicita. Il modo usuale di definire una tale funzione generica è quella di inserirlo in un modulo, come nell’esempio riportato di seguito.

module AritmeticaRazionale
   type rational
      integer n, d   ! Numeratore e denominatore.
   end type rational

   interface operator (*)
      module procedure integerRationalMultiply, &
                       rationalIntegerMultiply
   end interface

   contains

   function integerRationalMultiply( i, r )
      type( rational ) integerRationalMultiply
      integer, intent( in ) :: i
      type( rational ), intent( in ) :: r

      integerRationalMultiply = rational( i * r%n, r%d )
   end function integerRationalMultiply

   function rationalIntegerMultiply( r, i )
      type( rational ) rationalIntegerMultiply
      type( rational ), intent( in ) :: r
      integer, intent( in ) :: i

      rationalIntegerMultiply = rational( i * r%n, r%d )
   end function rationalIntegerMultiply

end module AritmeticaRazionale

LINK DI APPROFONDIMENTO PER L’ARGOMENTO:

Leave a Reply

Your email address will not be published. Required fields are marked *