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.

374 Puntatori<br />

PRINT*, q ! ...stampati i dati della memoria dinamica<br />

DEALLOCATE(q)<br />

PRINT*, q ! Operazione non valida!!!<br />

END IF<br />

END PROGRAM IO_con_puntatori<br />

Come è evidente, la prima istruzione di scrittura impone il dereferencing del puntatorepper cui<br />

produce la stampa del vettorearr. Le successive operazioni di lettura e scrittura diqfunzionano<br />

allo stesso modo per cui il programma dapprima attende la lettura di cinque valori reali da<br />

introdurre nelle locazioni della memoria dinamica precedentemente allocata e successivamente<br />

ne produce la stampa. L’ultima istruzione di output, relativa al puntatore q, collocata subito<br />

dopo la deallocazione della memoria a cui esso puntava, non è valida per cui produce un<br />

messaggio di errore in fase di esecuzione ed il conseguente arresto del programma.<br />

7.6 Un uso efficiente dei puntatori<br />

<strong>Il</strong> seguente esempio mostra come un uso particolarmente semplice dei puntatori possa aumentare<br />

l’efficienza di un programma. Si supponga di dover applicare una procedura di swap a due<br />

array reali bidimensionali di 100×100 elementi. La procedura tradizionale che normalmente si<br />

applicherebbe in questo caso è la seguente:<br />

REAL, DIMENSION(100,100) :: array1, array2, app<br />

...<br />

app = array1<br />

array1 = array2<br />

array2 = app<br />

Questo frammento di codice è molto semplice ma scarsamente efficiente visto che comporta lo<br />

spostamento fisico di 10000 valori reali in ognuna delle tre precedenti istruzioni di assegnazione.<br />

La stessa operazione può essere condotta operando con i puntatori ai due oggetti da invertire,<br />

scambiando in tal modo soltanto gli indirizzi dei due array target e non gli interi array:<br />

REAL, DIMENSION(100,100), TARGET :: array1, array2<br />

REAL, DIMENSION(:,:), POINTER :: p1, p2, app<br />

...<br />

p1 => array1<br />

p2 => array2<br />

...<br />

app => p1<br />

p1 => p2<br />

p2 => app<br />

L’unico prezzo da pagare è il fatto che ogni riferimento agli array dovrà avvenire a mezzo degli<br />

identificatori dei loro puntatori (in altre parole, ogni volta che bisognerà riferirsi, ad esempio,

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

Saved successfully!

Ooh no, something went wrong!