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 247<br />

Per quanto concerne la lista degli attributi, è bene osservare che l’attributo OPTIONAL è<br />

compatibile soltanto con gli attributi DIMENSION, EXTERNAL, INTENT, POINTER, e TARGET. Si<br />

noti, inoltre, che, a meno di non usare parametri formali come parole chiave, l’ordine con cui<br />

appaiono gli argomenti è essenziale sicché, con riferimento all’esempio precedente, è impossibile<br />

chiamare la subroutine sub con l’argomento d senza l’argomento c:<br />

CALL sub(a,b,d) ! illegale<br />

In una istruzione di chiamata di procedura, all’interno di un lista di parametri attuali, gli<br />

argomenti opzionali devono apparire dietro a tutti gli argomenti associati per posizione. Inoltre<br />

la procedura invocata richiede una interfaccia esplicita nell’unità di programma chiamante.<br />

E’ possibile ”interrogare” una procedura per sapere se un dato parametro opzionale è presente<br />

o meno a mezzo della funzione intrinseca PRESENT, come illustrato nell’esempio seguente:<br />

PROGRAM appello<br />

INTEGER :: b<br />

CALL who(1,2) ! stampa "a presente" e "b presente"<br />

CALL who(1) ! stampa "a presente"<br />

CALL who(b=2) ! stampa "b presente"<br />

CALL who() ! non stampa niente<br />

CONTAINS<br />

SUBROUTINE who(a,b)<br />

INTEGER, OPTIONAL :: a, b<br />

IF(PRESENT(a)) PRINT*, "a presente"<br />

IF(PRESENT(b)) PRINT*, "b presente"<br />

END SUBROUTINE who<br />

END PROGRAM appello<br />

La funzione intrinseca PRESENT, dunque, riceve in ingresso l’identificatore di un argomento<br />

formale (e, dunque, si applica ad una variabile di tipo qualsiasi) e restituisce in uscita il valore<br />

logico .TRUE. se detto parametro fa parte della lista degli argomenti effettivi, il valore logico<br />

.FALSE. in caso contrario.<br />

Si osservi, ora, la seguente subroutine:<br />

SUBROUTINE sub(a,b,c)<br />

REAL, INTENT(IN) :: a, b<br />

REAL, INTENT(IN), OPTIONAL :: c<br />

REAL :: reciproco_c<br />

...<br />

IF(PRESENT(c)) THEN<br />

reciproco_c = 1./c<br />

ELSE<br />

reciproco_c = 0.<br />

END IF<br />

...<br />

END SUBROUTINE sub

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

Saved successfully!

Ooh no, something went wrong!