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.

5.13 Effetti collaterali nelle funzioni 273<br />

Shiftando 84 a destra di 1 bit si ottiene: 000000101010<br />

che corrisponde al numero intero: 42<br />

Shiftando 84 a destra di 2 bit si ottiene: 000000010101<br />

che corrisponde al numero intero: 21<br />

Osservando con attenzione l’output prodotto da questo programma ci si accorge immediatamente<br />

che spostare verso sinistra di una posizione i bit di un numero equivale a moltiplicare<br />

questo numero per due (purché, è doveroso aggiungere, i bit 1 non oltrepassino la posizione<br />

limite e si faccia uso di interi senza segno). Analogamente, lo scorrimento verso destra di una<br />

posizione ha l’effetto di dividere quel numero per due. Un’applicazione molto interessante di<br />

questa proprietà potrebbe essere, pertanto, quella di utilizzare la funzione ISHFT in luogo dei<br />

comuni operatori algebrici * e / nel caso in cui sia necessario eseguire in maniera estremamente<br />

rapida delle semplici operazioni di divisione e moltiplicazione per potenze di due, purché,<br />

naturalmente, i dati corrispondano alle limitazioni indicate.<br />

5.13 Effetti collaterali nelle funzioni<br />

Attraverso la lista degli argomenti una function riceve i puntatori alle locazioni di memoria<br />

dei suoi argomenti e può, deliberatamente o accidentalmente, modificare il contenuto di queste<br />

locazioni. Dunque, una function può modificare i valori dei suoi argomenti; ciò accade se<br />

uno o più dei suoi argomenti compaiono alla sinistra di un’istruzione di assegnazione. Una<br />

funzione che modifichi il valore dei suoi argomenti è detta avere effetti collaterali (side effect).<br />

Per definizione, una funzione deve produrre un singolo valore di output che sia univocamente<br />

determinato a partire dai valori dei suoi argomenti di input, e non dovrebbe mai avere effetti<br />

collaterali. Se il programmatore necessita di produrre più di un output dalla sua procedura,<br />

allora dovrà scrivere una subroutine e non una function. Per assicurare che gli argomenti di<br />

una funzione non vengano accidentalmente modificati essi dovrebbero sempre essere dichiarati<br />

con l’attributo INTENT(IN).<br />

Al fine di comprendere quali effetti subdoli possono avere gli effetti collaterali di una<br />

function, si osservi il seguente esempio. Si consideri la seguente istruzione di assegnazione:<br />

somma = func1(a,b,c)+func2(a,b,c)<br />

in cui le function func1 e func2 sono le seguenti:<br />

INTEGER FUNCTION func1(a,b,c)<br />

IMPLICIT NONE<br />

...<br />

a = a*a<br />

func1 = a/b<br />

END FUNCTION func1<br />

INTEGER FUNCTION func2(a,b,c)

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

Saved successfully!

Ooh no, something went wrong!