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.

7.3 Stato di associazione di un puntatore 367<br />

ad un qualsiasi target, .FALSE. se il puntatore è stato annullato con l’istruzione NULLIFY.<br />

Quando è presente anche il riferimento a target, la funzione ASSOCIATED restituisce il valore<br />

.TRUE. se il puntatore è associato al target in questione, il valore .FALSE. se il puntatore non<br />

è associato a quel target o se è stato annullato con l’istruzione NULLIFY. Si badi che testare<br />

lo stato di un puntatore indefinito comporta un errore in fase di esecuzione. E’, pertanto,<br />

buona norma ”annullare” tutti i puntatori che non siano immediatamente associati dopo la loro<br />

dichiarazione. A tale scopo il <strong>Fortran</strong> <strong>95</strong> ha introdotto la funzione intrinseca NULL che può<br />

essere usata per annullare un puntatore mentre lo si sta dichiarando, come si può vedere nel<br />

seguente esempio:<br />

REAL, POINTER :: pr1=NULL(), pr2=NULL()<br />

INTEGER, POINTER :: pi=NULL()<br />

La funzione intrinseca NULL può tornare particolarmente utile in fase di definizione di un tipo<br />

di dati derivato, allo scopo di inizializzarne una componente definita con attributo POINTER:<br />

TYPE :: entry<br />

INTEGER :: n=10<br />

REAL :: x=3.14<br />

TYPE(entry), POINTER :: next=>NULL()<br />

END TYPE entry<br />

TYPE(entry),DIMENSION(100) :: matrix<br />

Si ricorda, a scanso di equivoci, che l’inizializzazione ”contestuale” delle componenti di un tipo<br />

di dati derivato è, così come la procedura intrinseca NULL, prerogativa del <strong>Fortran</strong> <strong>95</strong> per cui<br />

l’esempio precedente non può essere compilato con un compilatore <strong>Fortran</strong> <strong>90</strong>. Naturalmente<br />

l’inizializzazione può aver luogo anche direttamente in fase dichiarativa, per cui l’esempio<br />

precedente può essere riscritto al modo seguente:<br />

TYPE :: entry<br />

INTEGER :: n<br />

REAL :: x<br />

TYPE(entry), POINTER :: next<br />

END TYPE entry<br />

TYPE(entry),DIMENSION(100) :: matrix=entry(10,3.14,NULL())<br />

<strong>Il</strong> seguente frammento di programma mostra, infine, alcuni esempi di utilizzo della funzione<br />

intrinseca ASSOCIATED e del comando NULLIFY:<br />

REAL, POINTER :: pt1, pt2 ! stato indefinito<br />

REAL, TARGET :: t1, t2<br />

LOGICAL :: test<br />

pt1 => t1 ! pt1 associato<br />

pt2 => t2 ! pt2 associato<br />

test = ASSOCIATED(pt1) ! .T. (pt1 è associato a t1)<br />

test = ASSOCIATED(pt2) ! .T. (pt2 è associato a t2)

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

Saved successfully!

Ooh no, something went wrong!