|
Un discorso simile a quello delle variabili
ALLOCATABLE, vale anche per le variabili con l'attributo
POINTER: in particolare anche esse possono essere allocate e
deallocate con le stesse istruzioni.
A differenza delle variabili ALLOCATABLE, le variabili con l'attributo POINTER non devono essere necessariamente array, e, in alternativa ad essere allocate, possono anche essere fatte puntare (o "associate") ad una variabile di tipo corrispondente già esistente (ivi compreso un array o una sezione di array), tramite l'operatore =>. Lo stato di associazione di una variabile POINTER si controlla con la funzione ASSOCIATED() (non ALLOCATED()!!); attenzione che all'inizio dell'esecuzione di un programma, le variabili POINTER si trovano in uno stato indefinito, per cui non ha senso usare su di esse la funzione ASSOCIATED() prima di prima di rendere il puntatore "disassociato" tramite la funzione NULLIFY() o prima di associare il puntatore tramite la ALLOCATE() o l'operatore =>. In F95 è anche possibile utilizzare la funzione intrinseca NULL() per nullificare un puntatore direttamente nella sua dichiarazione attraverso l'operatore =>. Affinché una variabile possa essere puntata da un POINTER, deve avere l'attributo TARGET che serve per comunicare al compilatore di evitare eventuali ottimizzazioni pericolose. Un tipo derivato (TYPE) può contenere membri di tipo POINTER ad array; questo permette, ad esempio, di definire un vettore di tipi, ciascun elemento del quale contiene a sua volta un vettore con lunghezza diversa; non è invece possibile usare l'attributo ALLOCATABLE nei membri di un tipo (lo sarà in F2003). Un tipo derivato (TYPE) può contenere anche membri di tipo POINTER ad un tipo derivato uguale al tipo stesso; questo permette di costruire strutture ad albero o di tipo linked list come con il linguaggio C.
|
PROGRAM puntatur INTEGER, TARGET :: s, a(3,6) INTEGER, POINTER :: ps, pa(:,:) s = 3 ps => s ps = 2 ps => NULL() a = 1 PRINT*,'Prima:' PRINT*,a pa => a(:,::2) pa = 2 PRINT*,'Dopo:' PRINT*,a END PROGRAM puntatur |