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.

6.5 Array allocabili 325<br />

consecutive allora sarà necessario lavorare con array allocabili. Se, invece, sono necessari array<br />

di modeste dimensioni e non è richiesto che i loro valori vengano conservati, è da preferirsi la<br />

maggiore semplicità associata all’uso degli array automatici.<br />

Si noti che esistono tre limitazioni connesse all’uso degli array allocabili:<br />

• Gli array allocabili non possono essere argomenti formali di una procedura.<br />

• <strong>Il</strong> risultato di una funzione non può essere un array allocabile.<br />

• Gli array allocabili non possono essere usati nella definizione di un tipo di dati derivato.<br />

A causa della prima di tali restrizioni, un array allocabile deve essere allocato e deallocato<br />

nella stessa unità di programma nella quale è stato dichiarato. Questo limite può, tuttavia,<br />

essere aggirato dichiarando l’array allocabile in un modulo: ciascuna unità di programma che<br />

usi quel modulo avrà la possibilità di usare, allocare e deallocare l’array. Se, invece, fosse<br />

necessario avere un array dinamico come componente di un tipo di dati derivato, allora si dovrà<br />

necessariamente fare uso dei puntatori.<br />

E’ da precisare, inoltre, che un array allocabile che non risulti correntemente allocato non<br />

può essere utilizzato come parametro attuale in una chiamata di procedura, potendo al più<br />

essere usato come argomento di alcune funzioni intrinseche, come ALLOCATED (che, come detto,<br />

fornisce lo stato di allocazione di un array allocabile), DIGITS (che dà informazioni circa il tipo),<br />

KIND e LEN (che forniscono informazioni circa i parametri di kind).<br />

<strong>Il</strong> seguente esempio mostra, a scopo di riepilogo, un uso combinato di array allocabili, automatici<br />

e di forma presunta:<br />

PROGRAM array<br />

IMPLICIT NONE<br />

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

REAL :: res<br />

INTEGER :: n, impos<br />

INTERFACE<br />

SUBROUTINE sub(a,res)<br />

REAL, DIMENSION(:,:), INTENT(IN) :: a<br />

REAL, DIMENSION(SIZE(a,1),SIZE(a,2)) :: work<br />

END SUBROUTINE sub<br />

END INTERFACE<br />

...<br />

READ (*,*) n<br />

ALLOCATE (a(n,n),STAT=impos) ! allocatable array<br />

IF (impos=0) THEN<br />

CALL sub(a,res)<br />

...<br />

END IF<br />

...

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

Saved successfully!

Ooh no, something went wrong!