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.

372 Puntatori<br />

CALL setm(2,2,tmp(1:2,1:2), A)<br />

CALL setm(2,4,tmp, B)<br />

PRINT*, ’matrice A’<br />

CALL printm(A)<br />

PRINT*, ’matrice B’<br />

CALL printm(B)<br />

C = A*B + 2.0 * B<br />

PRINT*, "matrice AB + 2B"<br />

CALL printm(C)<br />

CALL remove(C)<br />

END PROGRAM test<br />

Si noti che mediante l’istruzione DEALLOCATE si può deallocare soltanto la memoria creata<br />

con una istruzioneALLOCATE: un qualsiasi tentativo, infatti, di applicare l’istruzioneDEALLOCATE<br />

ad un puntatore associato ad un target non creato con una istruzione ALLOCATE genererà un<br />

errore in fase di esecuzione che interromperà il programma, a meno che non sia stata usata la<br />

clausola STAT=.<br />

Data la perfetta analogia formale tra le istruzioni di allocazione e deallocazione di un puntatore<br />

e quelle valide per un allocatable array è chiaro che, laddove risulti appropriato, puntatori<br />

ed array allocabili possono essere allocati e deallocati nella medesima istruzione.<br />

A questo punto appare doveroso mettere a confronto puntatori ed array allocabili relativamente<br />

alla loro funzione di allocare memoria in modo dinamico, allo scopo di comprendere<br />

quando convenga utilizzare gli uni e quando gli altri. Ebbene, del tutto in generale si può<br />

asserire che la scelta dovrebbe cadere sugli array allocabili quando a tutto il resto si vogliano<br />

anteporre le caratteristiche di semplicità di impiego e di efficienza del codice generato; sui puntatori<br />

quando, al contrario, si vogliano preferire la versatilità dell’utilizzo e la ricchezza della<br />

gamma di impiego. Quanto asserito appare ben supportato dalle seguenti considerazioni:<br />

• L’impiego di array allocabili è limitato dal fatto che essi non possono essere utilizzati<br />

come componenti di strutture. Quindi una espressione del tipo:<br />

TYPE stack<br />

INTEGER :: index<br />

INTEGER, ALLOCATABLE, DIMENSION(:) :: content ! Errore!!!<br />

END TYPE stack<br />

è completamente sbagliata. Nel caso in cu fosse necessario realizzare strutture dati<br />

dinamiche si dovrà ricorrere a puntatori:<br />

TYPE stack<br />

INTEGER :: index<br />

INTEGER, POINTER, DIMENSION(:) :: content<br />

END TYPE stack<br />

Su questo argomento, comunque, si tornerà alla fine del capitolo.

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

Saved successfully!

Ooh no, something went wrong!