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.

382 Puntatori<br />

7.9 Funzioni Puntatore<br />

Anche il risultato di una funzione può avere l’attributo POINTER, la qual cosa può tornare<br />

molto utile, ad esempio, in quei casi in cui le dimensioni del risultato non sono note a priori ma<br />

dipendono anch’stesse dai calcoli eseguiti all’interno della funzione stessa. In questi casi risulta<br />

necessario l’utilizzo della parola chiave RESULT nella definizione della funzione ed è inoltre la<br />

variabile risultato a dover essere definita con l’attributo POINTER. Si deve, infine, rispettare<br />

il consueto vincolo dell’interfaccia esplicita nell’unità chiamante. <strong>Il</strong> risultato della funzione<br />

puntatore può essere normalmente usato in una istruzione di assegnazione di puntatore purché<br />

associato ad un target valido. Di seguito si riporta un esempio di funzione puntatore ed un<br />

frammento di programma che la richiama.<br />

MODULE mio_mod<br />

IMPLICIT NONE<br />

CONTAINS<br />

FUNCTION even_pointer(a) RESULT(p)<br />

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

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

p => a(2::2)<br />

END FUNCTION even_pointer<br />

END MODULE mio_mod<br />

PROGRAM pointer_function<br />

USE mio_mod<br />

IMPLICIT NONE<br />

REAL, DIMENSION(15), TARGET :: a<br />

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

...<br />

pa => a<br />

p => even_pointer(pa) ! p punta agli elementi pari di a<br />

q => even_pointer(p) ! q punta agli elementi pari di p<br />

r => even_pointer(q) ! r punta agli elementi pari di q<br />

...<br />

END PROGRAM pointer_function<br />

In breve, il programma pointer_function usa la funzione even_pointer dapprima per far<br />

sì che p punti agli elementi pari di pa, ossia per associare p al vettore formato dagli elementi<br />

a(2), a(4), a(6), a(8), a(10), a(12), a(14). Poi, il puntatore q viene associato agli elementi<br />

pari dell’array puntato da p (che pertanto viene deriferito) sicché q punterà all’array formato<br />

da a(4), a(8) e a(12). Infine, r viene puntato agli elementi pari del target di q, ossia viene<br />

associato al solo a(8).<br />

Come è noto, oltre alle procedure di modulo, anche le procedure interne realizzano automaticamente<br />

una interfaccia esplicita all’interno della procedura chiamante. Pertanto anche il<br />

seguente programma è perfettamente valido da un punto di vista sintattico.

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

Saved successfully!

Ooh no, something went wrong!