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.

2<strong>90</strong> Unità di Programma<br />

17.7999992 18.2000008 -4.2000003 -3.7999997<br />

75.2099991 78.8100052 0.6216216 0.6513762<br />

E’ importante osservare, in conclusione, che la precedenza di un operatore predefinito non<br />

viene alterata dall’operazione di overloading, per cui, ad esempio, gli operatori ”/” e ”*” estesi<br />

hanno un livello di precedenza superiore rispetto agli operatori ”+” e ”-”, e così via. Inoltre, è da<br />

precisare che, allorquando un operatore intrinseco viene sottoposto ad overloading, il numero<br />

degli argomenti deve essere consistente con la forma intrinseca (per cui, ad esempio, non sarà<br />

possibile definire un operatore * di tipo unario).<br />

<strong>Il</strong> modulo seguente rappresenta un interessante esempio di applicazione delle possibilità di<br />

overloading offerte dal <strong>Fortran</strong>. Lo scopo di questo esempio è quello di definire un tipo matrix<br />

tale che gli operatori aritmetici di somma, prodotto, divisione etc. lavorino ”a la Matlab”. In un<br />

certo senso, quindi, si vuole ”riscrivere” il significato degli operatori aritmetici * e/in modo tale<br />

che questi non lavorino più elemento×elemento; in particolare si vuole utilizzare l’operatore<br />

* per eseguire prodotti righe×colonne e renderlo, pertanto, applicabile anche ad operandi di<br />

forma diversa, e l’operatore / per eseguire procedure di inversione di matrici.<br />

MODULE operatori<br />

TYPE matrix<br />

REAL :: elem<br />

END TYPE matrix<br />

INTERFACE OPERATOR(+)<br />

MODULE PROCEDURE matrix_add, vector_add<br />

END INTERFACE<br />

INTERFACE OPERATOR(-)<br />

MODULE PROCEDURE matrix_sub, vector_sub<br />

END INTERFACE<br />

INTERFACE OPERATOR(*)<br />

MODULE PROCEDURE matrix_mul, vector_mul, matrix_vector_mul<br />

END INTERFACE<br />

INTERFACE OPERATOR(/)<br />

MODULE PROCEDURE matrix_div, matrix_vector_div<br />

END INTERFACE<br />

CONTAINS<br />

!<br />

! Operatore "somma": X = Y + Z<br />

!<br />

FUNCTION matrix_add(Y,Z) RESULT(X)

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

Saved successfully!

Ooh no, something went wrong!