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.8 Argomenti delle Procedure 249<br />

FUNCTION series(x,lower,upper)<br />

IMPLICIT NONE<br />

INTEGER :: i,istart,upper<br />

REAL :: series,x<br />

INTEGER, OPTIONAL :: lower<br />

END FUNCTION series<br />

Per una procedura così definita, istruzioni del tipo:<br />

series(0.5,lower=1,upper=10)<br />

series(0.5,upper=10)<br />

sono validi esempi di istruzioni chiamanti.<br />

5.8.4 Array come parametri formali<br />

Come è noto, un argomento viene passato a una subroutine passando un puntatore che identifica<br />

la locazione di memoria dell’argomento. Se l’argomento è un array, il puntatore identifica il<br />

primo elemento dell’array. Tuttavia la procedura chiamata, per poter svolgere operazioni con<br />

l’array, necessita di conoscerne le dimensioni. Una tecnica potrebbe consistere nel passare i<br />

limiti di ogni dimensione dell’array sottoforma di argomenti nell’istruzione di chiamata, e di<br />

dichiarare il corrispondente array fittizio con le stesse dimensioni. L’array facente parte della<br />

lista di argomenti formali sarà, pertanto, un array fittizio di forma esplicita (explicit-shape<br />

array) in quanto ogni suo limite è specificato in forma esplicita. In tal caso la procedura conosce<br />

i limiti dell’array e il compilatore è in grado di identificare gli eventuali riferimenti alle locazioni<br />

di memoria che superano questi confini. Inoltre, è possibile in questo caso utilizzare sezioni<br />

di array o l’intero array per svolgere operazioni globali. Ad esempio, la seguente subroutine<br />

dichiara due array, vet1 e vet2, di forma esplicita, di estensione n, e ne elabora nval elementi:<br />

SUBROUTINE elabora(vet1,vet2,n,nval)<br />

IMPLICIT NONE<br />

INTEGER, INTENT(IN) n, nval<br />

REAL, DIMENSION(n), INTENT(IN) :: vet1<br />

REAL, DIMENSION(n), INTENT(OUT) :: vet2<br />

vet2 = 3.*vet1<br />

vet2(1:nval) = 1.<br />

END SUBROUTINE elabora<br />

Si noti che l’uso degli array fittizi di forma esplicita non richiede un’interfaccia esplicita. Questa<br />

tecnica è, tuttavia, poco pratica e trova applicazione solo occasionalmente.<br />

Esiste un’altra tecnica, più flessibile ed elegante, per passare un array ad una procedura.<br />

Quando una procedura ha un’interfaccia esplicita, tutti i dettagli sul tipo, l’ordine, lo scopo<br />

ed il rango degli argomenti fittizi della procedura sono noti all’unità chiamante e, allo stesso<br />

tempo, la procedura conosce anche tutti i dettagli sugli argomenti effettivi dell’unità chiamante.<br />

Di conseguenza, la procedura può conoscere la forma e la dimensione degli array effettivi che le

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

Saved successfully!

Ooh no, something went wrong!