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.

6.5 Array allocabili 323<br />

END IF<br />

END DO<br />

<strong>Il</strong> precedente frammento di programma alloca il vettore array_variabile con estremi -1 e +1,<br />

quindi esegue una serie di istruzioni che coinvolgono questo array al termine delle quali l’array<br />

viene deallocato. A questo punto il vettore array_variabile viene allocato nuovamente ma<br />

con estremi -2 e +2 e così via. <strong>Il</strong> suddetto procedimento viene ripetuto n volte. E’ evidente che,<br />

in questo esempio, se il vettore array_allocabile non venisse deallocato al termine di ogni<br />

iterazione, alla successiva istruzione di allocazione avrebbe luogo un errore in fase di esecuzione.<br />

E’ possibile verificare se un array allocabile sia o meno correntemente allocato attraverso la<br />

funzione intrinseca ALLOCATED. Questa funzione, che sarà trattata in maggiore dettaglio nella<br />

prossima sezione, ha come argomento di input il nome di un array allocabile e restituisce in<br />

output il valore .TRUE. se l’array è correntemente allocato, .FALSE. in caso contrario. L’uso<br />

di questa procedura di interrogazione previene la possibilità di commettere l’errore di tentare<br />

lavorare con array non allocati o di allocare array già allocati. Le seguenti istruzioni forniscono<br />

due possibili esempi di utilizzo della funzione ALLOCATED:<br />

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

INTEGER :: stato<br />

...<br />

IF (ALLOCATED(a)) DEALLOCATE(a)<br />

...<br />

IF (.NOT.ALLOCATED(a)) ALLOCATE(a(5,20),STAT=stato)<br />

E’ bene osservare che l’esecuzione dell’istruzione DEALLOCATE non è l’unico modo in cui<br />

un array allocabile può perdere il suo stato allocato. Infatti, l’uscita da una procedura nella<br />

quale l’array è correntemente allocato rende l’array stesso indefinito: tale array non potrà<br />

più essere usato, ridefinito, allocato o deallocato. Permettere ad un array di avere uno stato<br />

indefinito comporta una riduzione della memoria disponibile per il programma (memory leak).<br />

Si noti che le memory leak sono cumulative per cui un uso ripetuto di una procedura che<br />

provochi un simile problema aumenterà sempre più le dimensioni della regione di memoria<br />

inutilizzabile. D’altra parte soltanto la deallocazione degli array allocabili è responsabilità del<br />

programmatore in quanto tutte le variabili statiche (compresi gli array automatici) vengono<br />

rimossi automaticamente all’uscita dalla procedura a cui esse sono locali (a meno, ovviamente,<br />

di non averne specificato l’attributo SAVE in fase di dichiarazione). Questo ”preoccupazione” è<br />

stata eliminata dal <strong>Fortran</strong> <strong>95</strong> il cui standard prevede una deallocazione automatica, all’uscita<br />

da una procedura, di tutti gli array allocabili locali non salvati. E’, in ogni caso, sempre<br />

cattiva abitudine (oltre che una errore concettuale in <strong>Fortran</strong> <strong>90</strong>) permettere allo stato di<br />

array allocabile di diventare indefinito. Quando un allocatable array non serve più è sempre<br />

consigliabile deallocarlo prima di uscire dalla procedura nella quale è stato allocato. Nel caso<br />

in cui, invece, fosse necessario salvarlo fra due chiamate successive, esso andrà dichiarato con<br />

l’attributo SAVE, come nel seguente esempio:<br />

CHARACTER(LEN=50), ALLOCATABLE, DIMENSION(:), SAVE :: nome

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

Saved successfully!

Ooh no, something went wrong!