25.06.2013 Views

Il Linguaggio Fortran 90/95

Il Linguaggio Fortran 90/95

Il Linguaggio Fortran 90/95

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

288 Unità di Programma<br />

IF(s(i:i)== c) num = num+1<br />

END DO<br />

END FUNCTION num<br />

END MODULE overloading_divisione<br />

Normalmente il comune operatore di divisione non è definito per variabili carattere o stringhe ma<br />

il modulo overloading_divisione contiene una function che definisce una simile operazione,<br />

ed un’interfaccia ad essa. Così, ad esempio, la divisione fra la stringa ’hello world’ ed un<br />

carattere potrà essere effettuata al seguente modo:<br />

USE overloading_divisione<br />

...<br />

i = "hello world"/"l" ! i = 3<br />

i = "hello world"/"o" ! i = 2<br />

i = "hello world"/"z" ! i = 0<br />

Per rendere ancora più chiara la versatilità e la generalità dell’overloading degli operatori, si<br />

farà ora un esempio un pò più complesso. Si immagini di lavorare con un tipo di dati derivato,<br />

intervallo, i cui elementi, lower e upper, rappresentino gli estremi inferiore e superiore di<br />

un intervallo numerico, e si supponga di voler creare una ”aritmetica” degli intervalli definita<br />

in modo tale che, dati due ”intervalli”, un comune operatore aritmetico binario applicato alla<br />

coppia restituisca una nuova variabile intervallo i cui componenti (gli estremi dell’intervallo<br />

risultante) siano ottenuti applicando l’operatore aritmetico ”intrinseco” alle coppie formate dai<br />

componenti omologhi. <strong>Il</strong> modulo seguente, evidentemente, è quanto occorre allo scopo:<br />

MODULE aritmetica_intervalli<br />

TYPE intervallo<br />

REAL lower, upper<br />

END TYPE intervallo<br />

INTERFACE OPERATOR (+)<br />

MODULE PROCEDURE addizione_intervalli<br />

END INTERFACE<br />

INTERFACE OPERATOR (-)<br />

MODULE PROCEDURE sottrazione_intervalli<br />

END INTERFACE<br />

INTERFACE OPERATOR (*)<br />

MODULE PROCEDURE moltiplicazione_intervalli<br />

END INTERFACE<br />

INTERFACE OPERATOR (/)<br />

MODULE PROCEDURE divisione_intervalli<br />

END INTERFACE<br />

CONTAINS<br />

FUNCTION addizione_intervalli(a,b)<br />

TYPE(intervallo), INTENT(IN) :: a, b<br />

TYPE(intervallo) :: addizione_intervalli

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

Saved successfully!

Ooh no, something went wrong!