25.06.2013 Views

Il Linguaggio Fortran 90/95

Il Linguaggio Fortran 90/95

Il Linguaggio Fortran 90/95

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

286 Unità di Programma<br />

SUBROUTINE swapcomplex(a,b)<br />

REAL, INTENT(INOUT) :: a, b<br />

END SUBROUTINE swapcomplex<br />

END INTERFACE<br />

per invertire due numeri x ed y sarà sufficiente invocare la procedura generica swap mediante<br />

l’istruzione di chiamata swap(x,y) indipendentemente dal tipo (intero, reale o complesso) dei<br />

parametri attuali.<br />

Tutto quanto detto finora vale esclusivamente per funzioni esterne compilate separatamente<br />

e non aventi una interfaccia esplicita. Un discorso a parte vale nel caso in cui le procedure<br />

”individuali” fanno parte di un modulo e quindi hanno già una interfaccia esplicita. Sebbene sia<br />

illegale inserire una procedura di modulo in un interface block, è, invece, perfettamente lecito<br />

inserire una procedura di modulo in un generic interface block attraverso la speciale istruzione<br />

MODULE PROCEDURE, la cui sintassi è:<br />

MODULE PROCEDURE module_procedure1 [, module_procedure2, ...]<br />

in cuimodule_procedure è una procedura di modulo resa disponibile attraverso una associazione<br />

di USE. A titolo di esempio, se le procedure swapint, swapreal e swapcomplex dell’esempio<br />

precedente non fossero state delle procedure esterne bensì delle procedure di modulo, allora il<br />

generic interface block sarebbe dovuto essere il seguente:<br />

INTERFACE swap<br />

MODULE PROCEDURE swapint<br />

MODULE PROCEDURE swapreal<br />

MODULE PROCEDURE swapcomplex<br />

END INTERFACE<br />

5.17 Overloading<br />

<strong>Il</strong> riferimento ad una procedura, facente parte di un certo insieme, attraverso un nome generico<br />

è noto come overloading. Quale fra le diverse procedure sarà invocata dipende dagli argomenti<br />

scambiati. Allo stesso modo che con i nomi di procedura è possibile ”generalizzare” i comuni<br />

operatori aritmetici (+, -, *, /, **) al fine di definire un set di operatori che possano essere<br />

applicati, ad esempio, a variabili di tipi di dati derivati.<br />

<strong>Il</strong> <strong>Fortran</strong> <strong>90</strong>/<strong>95</strong> consente sia l’overloading degli operatori che l’overloading dell’assegnazione<br />

e in entrambi i casi è necessario un interface block. Moduli sono spesso usati per fornire un<br />

accesso globale ai nuovi operatori.<br />

5.17.1 Overloading degli operatori<br />

E’ possibile estendere il ”significato” di un operatore intrinseco per poterlo applicare a tipi di<br />

dati supplementari. Questo richiede un interface block nella forma:

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!