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.

7.8 Puntatori come parametri formali di procedure 379<br />

siano rispettate le seguenti condizioni:<br />

• Se una procedura ha un parametro formale con attributo POINTER oppure TARGET, l’interfaccia<br />

deve necessariamente essere esplicita (il che richiede, ad esempio, l’uso di un<br />

interface block per le chiamate a procedure esterne).<br />

• Se un parametro formale è un puntatore, anche il parametro attuale corrispondente deve<br />

essere un puntatore con lo stesso tipo e rango.<br />

• Un puntatore che sia parametro formale non può avere l’attributo INTENT né può comparire<br />

in una procedura ELEMENTAL del <strong>Fortran</strong> <strong>95</strong>.<br />

Quando entrambi i parametri (formale ed attuale) hanno l’attributo POINTER, attraverso<br />

l’istruzione di chiamata ed il ritorno alla unità chiamante vengono passati anche il target (se<br />

ne esiste uno) e lo stato di associazione. Pertanto è necessario assicurarsi che il target rimanga<br />

valido quando si ritorni all’unità chiamante (ossia è necessario che il target non sia locale alla<br />

procedura invocata); in caso contrario il puntatore resterebbe ”penzolante”.<br />

Quando l’argomento attuale è un puntatore ma il corrispondente argomento formale non<br />

lo è, il puntatore subisce il dereferencing ed è il suo target che viene assegnato al parametro<br />

formale: all’uscita dalla procedura chiamata il target del puntatore passato conserva il valore<br />

del parametro formale. Questo significa che è necessario, all’atto della chiamata di procedura,<br />

che detto puntatore sia associato ad un target.<br />

L’uso di puntatori come parametri di scambio fra procedure rende un programma <strong>Fortran</strong><br />

molto potente e flessibile ma aumenta, al contempo, le probabilità di commettere errori: in<br />

situazioni in cui, ad esempio, i puntatori sono allocati in una procedura, usati in un’altra e,<br />

infine, deallocati e annullati in un’altra ancora, è errore assai comune tentare di lavorare con<br />

puntatori deassociati o allocare nuovi array con puntatori già in uso. E’, quindi, buona norma,<br />

prima di lavorare con un puntatore, interrogarne lo stato di associazione a mezzo della funzione<br />

ASSOCIATED.<br />

A chiarimento di quanto detto, si consideri l’esempio seguente:<br />

PROGRAM esempio_sub<br />

INTERFACE<br />

SUBROUTINE sub(p)<br />

REAL, DIMENSION(:,:), POINTER :: p<br />

END SUBROUTINE sub<br />

END INTERFACE<br />

REAL, DIMENSION(:,:), POINTER :: punt<br />

...<br />

ALLOCATE(punt(100,100))<br />

CALL sub(punt)<br />

...<br />

END PROGRAM esempio_sub

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

Saved successfully!

Ooh no, something went wrong!