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.

324 Array Processing<br />

In tal caso, l’array rimarrà allocato all’uscita dalla procedura ed i suoi elementi conserveranno il<br />

loro valore. Se, invece, all’uscita dalla procedura l’array si trovasse già in uno stato deallocato,<br />

esso manterrebbe questo stato.<br />

Si noti che la possibilità di salvare un array allocabile fra due chiamate di procedura è<br />

uno dei maggiori vantaggi che presenta l’array allocabile rispetto a quello automatico il quale<br />

cessa sempre di esistere all’uscita dalla procedura nel quale è dichiarato. Inoltre, il maggiore<br />

controllo offerto dagli array allocabili rispetto a quelli automatici consente di gestire la memoria<br />

in maniera molto più dinamica ed efficiente, come mostrato dalla seguente procedura:<br />

SUBROUTINE space(n)<br />

IMPLICIT NONE<br />

INTEGER, INTENT(IN) :: n<br />

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

...<br />

ALLOCATE(a(2*n,6*n)) ! allocato spazio per a<br />

... ! istruzioni che coinvolgono a<br />

DEALLOCATE(a) ! liberato lo spazio occupato da a<br />

ALLOCATE(b(3*n,4*n)) ! allocato spazio per b<br />

... ! istruzioni che coinvolgono b<br />

DEALLOCATE(b) ! liberato lo spazio occupato da b<br />

END SUBROUTINE space<br />

La subroutine space usa 12n 2 elementi per a durante l’esecuzione della prima parte della procedura,<br />

successivamente libera lo spazio associato a questi elementi, usa ancora 12n 2 elementi per<br />

b durante la seconda parte, infine libera anche questa memoria. Pertanto, durante l’esecuzione<br />

della procedura, il massimo spazio di memoria usato dagli array a e b è quello richiesto per<br />

immagazzinare 12n 2 valori reali. Se, invece, la subroutine space venisse riscritta in modo da<br />

usare array automatici al posto di quelli allocabili:<br />

SUBROUTINE space(n)<br />

IMPLICIT NONE<br />

INTEGER, INTENT(IN) :: n<br />

REAL, DIMENSION(2*n,6*n) :: a<br />

REAL, DIMENSION(3*n,4*n) :: b<br />

... ! istruzioni che coinvolgono a<br />

... ! istruzioni che coinvolgono b<br />

END SUBROUTINE space<br />

per tutta la durata dell’esecuzione della procedura sarebbero allocati 12n 2 elementi per a e<br />

12n 2 elementi per b, per un totale (costante) di 24n 2 elementi creati quando il controllo del<br />

programma entra nella procedura e rilasciati soltanto all’uscita dalla procedura stessa. In casi<br />

come quello in esame, l’importanza di lavorare con array allocabili è, chiaramente, tanto più<br />

avvertita quanto maggiore è il valore di n. In ogni caso, la decisione di usare array allocabili<br />

o array automatici dipende essenzialmente dalle particolari condizioni. Infatti, nel caso in cui<br />

siano richiesti dei grossi array o se essi devono essere conservati fra due chiamate di procedura

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

Saved successfully!

Ooh no, something went wrong!