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.

380 Puntatori<br />

SUBROUTINE sub(p)<br />

REAL, DIMENSION(:,:), POINTER :: p<br />

...<br />

DEALLOCATE(p)<br />

...<br />

END SUBROUTINE sub<br />

In questo esempio, il puntatore punt è l’argomento dummy di una procedura esterna per cui<br />

l’introduzione di un interface block risulta necessaria allo scopo di fornire una interfaccia esplicita<br />

nell’unità di programma chiamante. Un’alternativa, ovviamente, poteva essere quella di<br />

inserire la procedura sub in un modulo oppure introdurla come procedura interna in modo da<br />

fornire una interfaccia esplicita di default. Si osservi, in sintesi, cosa fa il frammento di codice<br />

precedente. <strong>Il</strong> programma chiamante alloca dinamicamente una regione di memoria atta ad<br />

ospitare 100×100 valori reali e ne indica il puntatore punt come un alias; quindi invoca la procedura<br />

esterna sub. Questa chiamata di procedura associa il parametro formale p al parametro<br />

attuale punt; quando sub dealloca p anche l’argomento attuale punt viene deallocato (e con<br />

esso l’area di memoria a cui è associato).<br />

Questo modo di operare con i puntatori è più flessibile rispetto all’uso degli allocatable<br />

array. Questi ultimi, infatti, possono essere allocati e deallocati soltanto nella stessa unità di<br />

programma, ed inoltre possono essere usati come parametri formali in chiamate di procedura<br />

soltanto nella loro forma allocata. Pertanto, se l’allocazione deve avvenire all’interno della<br />

procedura chiamata si dovrà necessariamente far ricorso ai puntatori, come esemplificato nel<br />

seguente programma:<br />

PROGRAM pdemo<br />

IMPLICIT NONE<br />

REAL, POINTER :: parray(:)<br />

OPEN(UNIT=9, FILE=’mydata’, STATUS=’old’)<br />

CALL readin(9,parray)<br />

WRITE(*,*)’array of ’, SIZE(array), ’ points:’<br />

WRITE(*,*) parray<br />

DEALLOCATE(parray)<br />

STOP<br />

CONTAINS<br />

SUBROUTINE readin(iounit,z)<br />

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

REAL, POINTER :: z(:) ! NB: e’ vietato l’uso di INTENT<br />

INTEGER :: npoints<br />

READ(iounit) npoints ! legge le dimensioni<br />

ALLOCATE(z(1:npoints)) ! alloca lo spazio<br />

READ(iounit) z ! legge l’intero array<br />

END SUBROUTINE readin<br />

END PROGRAM pdemo

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

Saved successfully!

Ooh no, something went wrong!