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.

5.2 Procedure 221<br />

Quando una procedura viene invocata, l’unità chiamante passa, per ciascun parametro<br />

formale, l’indirizzo di memoria del corrispondente parametro attuale. Pertanto diventano direttamente<br />

utilizzabili dal sottoprogramma gli indirizzi delle locazioni in cui sono memorizzati<br />

i valori dei parametri attuali. In altre parole, gli argomenti fittizi di una procedura sono completamente<br />

definiti soltanto al momento dell’attivazione della procedura, quando ognuno di<br />

essi identifica la stessa locazione di memoria del corrispondente argomento effettivo. Questa<br />

modalità di scambio delle informazioni dall’unità chiamante alla procedura chiamata è detto<br />

passaggio di dati per riferimento in quanto all’atto della chiamata ciò che viene effettivamente<br />

passato sono i puntatori ai valori attuali e non i valori in sé.<br />

Quando un elemento della lista di argomenti è un array, ciò che viene passato dall’unità<br />

chiamante alla procedura invocata è la locazione di memoria del primo elemento dell’array. Gli<br />

indirizzi dei successivi elementi dell’array vengono determinati, a partire dal primo, in base al<br />

numero di dimensioni ed ai limiti di tali dimensioni, secondo le modalità di immagazzinamento<br />

delle variabili dimensionate tipica del <strong>Fortran</strong>.<br />

Infine, nel caso in cui il parametro effettivo sia un’espressione, essa viene calcolata prima<br />

della chiamata di procedura ed il suo valore viene assegnato ad una variabile interna del<br />

programma chiamante. Tale variabile interna rappresenta il parametro effettivo al quale la<br />

procedura accede. Quanto detto si applica anche quando il parametro effettivo sia una costante<br />

senza nome.<br />

E’ chiaro che, alterando il valore di un argomento fittizio, una procedura può cambiare il<br />

valore di un argomento attuale.<br />

• Una subroutine è usata per cambiare il valore di uno o più argomenti. Nel seguente<br />

esempio, la subroutine swap scambia i valori di due array reali:<br />

REAL, DIMENSION(10) :: x, y<br />

...<br />

CALL swap(x,y)<br />

SUBROUTINE swap(a,b)<br />

REAL, DIMENSION(10) :: a, b, temp<br />

temp = a<br />

a = b<br />

b = temp<br />

END SUBROUTINE swap<br />

• Una function è usata per generare un singolo risultato in funzione dei suoi argomenti.<br />

Nel seguente esempio la funzione line calcola il valore dell’ordinata, nota l’ascissa, di un<br />

punto di una retta:<br />

REAL :: y, x, c<br />

...<br />

x=1.0; c=2.5<br />

y=line(3.4,x,c)

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

Saved successfully!

Ooh no, something went wrong!