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.

7.5 Operazioni di I/O con puntatori 373<br />

• Gli array allocabili possono essere utilizzati come parametri attuali in chiamate di procedura<br />

soltanto nella loro forma allocata (inoltre i corrispondenti parametri formali dovranno<br />

essere array fittizi di forma presunta non potendo essere, essi stessi, array allocabili).<br />

Nel caso in cui fosse necessario condividere con un sottoprogramma un area di memoria<br />

non ancora allocata all’atto della chiamata di procedura, sarà necessario fare uso di puntatori.<br />

Un’altra possibilità per superare il limite di cui sopra è quella di definire gli array<br />

allocabili in un modulo, come questo:<br />

MODULE miomodulo<br />

! Scopo: Condividere array allocabili fra piu’<br />

! unita’ di programma<br />

SAVE<br />

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

INTEGER, ALLOCATABLE, DIMENSION(:) :: b, c<br />

END MODULE miomodulo<br />

e condividerne l’uso fra l’unità chiamante e la procedura invocata.<br />

• Le procedure di ottimizzazione operate da un compilatore ottimizzante sono di gran lunga<br />

più complicate su un codice che faccia largo uso di puntatori piuttosto che di array<br />

allocabili e ciò a causa del fatto che l’utilizzo di puntatori comporta tipicamente l’impiego<br />

di diversi alias per riferirsi ad una medesima area di memoria. Al contrario, una variabile<br />

array e l’area di memoria a cui si riferisce è sempre determinabile con estrema semplicità<br />

e in maniera assolutamente non ambigua.<br />

7.5 Operazioni di I/O con puntatori<br />

Quando un puntatore appare in un’istruzione di I/O esso subisce un immediato dereferencing<br />

sicché ciò che viene effettivamente letto o prodotto in stampa è il valore del suo target. Chiaramente,<br />

affinché un’operazione di I/O che coinvolga un puntatore sia valida è necessario che il<br />

puntatore in oggetto si trovi nello stato associato, poiché in caso contrario il dereferencing non<br />

potrebbe avere luogo. Allo scopo di chiarire questo semplice concetto si può fare riferimento al<br />

programma seguente:<br />

PROGRAM IO_con_puntatori<br />

IMPLICIT NONE<br />

INTEGER :: ierr<br />

REAL, DIMENSION(3), TARGET :: arr=(/1.,2.,3./)<br />

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

p => arr<br />

PRINT*, p ! viene stampato arr<br />

ALLOCATE(q(5),STAT=ierr)<br />

IF(ierr == 0) THEN<br />

READ(*,*) q ! Vengono dapprima letti e poi...

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

Saved successfully!

Ooh no, something went wrong!