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.

222 Unità di Programma<br />

FUNCTION line(m,x,cost)<br />

REAL :: line<br />

REAL :: m, x, cost<br />

line = m*x+cost<br />

END FUNCTION line<br />

<strong>Il</strong> nome della function,line, è trattato esattamente come una variabile: esso deve, perciò,<br />

essere dichiarato con lo stesso tipo della variabile y che serve ad immagazzinare il valore<br />

della funzione nell’unità chiamante.<br />

Va sottolineato che ad ogni parametro formale di uscita deve corrispondere come parametro<br />

attuale una variabile oppure un elemento di variabile dimensionata. In altri termini, una<br />

costante o una espressione non devono essere usate come parametro attuale in corrispondenza<br />

di un parametro formale il cui valore venga definito oppure modificato nel corpo del sottoprogramma.<br />

Infatti, se l’argomento attuale è una costante, qualunque modifica del corrispondente<br />

argomento fittizio provoca un cambiamento del valore della costante che, invece, per definizione<br />

deve rimanere inalterato durante tutta l’esecuzione del programma. <strong>Il</strong> divieto di utilizzare<br />

un’espressione in corrispondenza di un argomento fittizio di uscita deriva, invece, dal fatto che<br />

l’associazione tra l’espressione ed il corrispondente parametro formale avviene mediante l’indirizzo<br />

della locazione nella quale, al momento della chiamata della procedura, è memorizzato<br />

il valore dell’espressione. Questo indirizzo viene trasmesso al sottoprogramma ma non è noto<br />

all’unità di programma attivante che, pertanto, non lo può utilizzare. Si osservi, infine, che se<br />

due parametri attuali coincidono, nessuno dei corrispondenti parametri formali può essere un<br />

argomento di uscita.<br />

5.2.4 Alcune note sull’utilizzo delle procedure<br />

A volte è possibile migliorare l’efficienza di un programma semplicemente evitando di invocare<br />

una procedura quando non strettamente necessario. Calcolare, infatti, il valore di una funzione<br />

o degli argomenti di uscita di una subroutine è, di norma, un’operazione molto più lenta<br />

rispetto alla valutazione di una comune espressione all’interno, ad esempio, del programma<br />

principale. Ad esempio, se lo stesso valore di una funzione è richiesto più volte durante l’esecuzione<br />

del programma, piuttosto che invocare ogni volta questa funzione può essere comodo<br />

precomputarne i valori ”utili” e sostituire, nel corso del programma, le chiamate di procedura<br />

con la lettura dei valori precalcolati immagazzinati in una opportuna struttura (table lookup).<br />

Ciò, naturalmente, non deve essere visto soltanto in termini di tempo necessario affinché una<br />

funzione venga calcolata ma anche riguardo al numero di volte che la stessa funzione viene<br />

invocata con il medesimo input. C’è però da considerare il fatto che, nei computer di moderna<br />

concezione, l’esecuzione di istruzioni semplici (quale è, ad esempio, una comune assegnazione)<br />

è, di norma, notevolmente più rapida dell’acquisizione di un dato in memoria (talvolta questa<br />

differenza si può quantificare in diversi ordini di grandezza). Per cui, se è richiesto un ”costoso”<br />

accesso alla memoria ogni qualvolta si necessita di un valore di questo tipo (ad esempio se<br />

l’accesso deve avvenire a dati contenuti su file esterni come quelli dell’hard disk) una soluzione

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

Saved successfully!

Ooh no, something went wrong!