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.

7.7 Puntatori a sezioni di array 377<br />

INTEGER, DIMENSION(16), TARGET :: vet=(/(i, i=1,16)/)<br />

INTEGER, DIMENSION(16), POINTER :: ptr1, ptr2, ptr3, ptr4, ptr5<br />

ptr1 => vet<br />

ptr2 => ptr1(2::2)<br />

ptr3 => ptr2(2::2)<br />

ptr4 => ptr3(2::2)<br />

ptr5 => ptr4(2::2)<br />

WRITE(*,’(A,16I3)’) " ptr1 = ", ptr1<br />

WRITE(*,’(A,16I3)’) " ptr2 = ", ptr2<br />

WRITE(*,’(A,16I3)’) " ptr3 = ", ptr3<br />

WRITE(*,’(A,16I3)’) " ptr4 = ", ptr4<br />

WRITE(*,’(A,16I3)’) " ptr5 = ", ptr5<br />

END PROGRAM point_sez_array<br />

<strong>Il</strong> risultato fornito da questo programma è, chiaramente, il seguente:<br />

ptr1 = 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16<br />

ptr2 = 2 4 6 8 10 12 14 16<br />

ptr3 = 4 8 12 16<br />

ptr4 = 8 16<br />

ptr5 = 16<br />

Si noti, però, che sebbene i puntatori lavorino con sezioni di array definite da triplette di<br />

indici, essi non funzionano con sezioni di array definiti da indici vettoriali. Ad esempio, il<br />

programma seguente fornirà un errore in fase di compilazione:<br />

PROGRAM bad_sez_array<br />

IMPLICIT NONE<br />

INTEGER :: i<br />

INTEGER, DIMENSION(3) :: indvet=(1,3,11)<br />

INTEGER, DIMENSION(16), TARGET :: vet=(/(i, i=1,16)/)<br />

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

punt => vet(indvet) ! errore: sezione di array con indice vettoriale<br />

WRITE(*,’(1X,A,16I3)’) ’punt = ’, punt<br />

END PROGRAM bad_sez_array<br />

Come ulteriore esempio di puntatori a sezioni di array si potrebbe pensare di riscrivere il<br />

programma di risoluzione dell’equazione di Laplace già incontrato al capitolo 3. Ancora una<br />

volta si perviene ad un codice eccezionalmente compatto ed efficiente, magari appena un pò<br />

meno ”immediato” da interpretare:<br />

PROGRAM laplace_con_punt<br />

! *** Sezione dichiarativa ***<br />

IMPLICIT NONE<br />

REAL,DIMENSION(10,10),TARGET :: Told

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

Saved successfully!

Ooh no, something went wrong!