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.

130 Array<br />

Inizializzazione attraverso l’istruzione di dichiarazione di tipo<br />

I valori iniziali possono essere caricati nell’array già in fase di compilazione specificandoli nella<br />

istruzione di dichiarazione di tipo. A tale scopo è necessario utilizzare un costruttore di array<br />

che specifichi i valori iniziali degli elementi. Ad esempio, la seguente istruzione dichiara l’array<br />

arr di cinque elementi interi e, al tempo stesso, ne imposta i valori degli elementi a 1, 2, 3, 4<br />

e 5:<br />

INTEGER, DIMENSION(5) :: arr=(/1,2,3,4,5/)<br />

Chiaramente, il numero degli elementi nella costante di array deve coincidere con il numero degli<br />

elementi dell’array da inizializzare. Se questi due numeri sono diversi si genererà un errore di<br />

compilazione.<br />

<strong>Il</strong> metodo testé descritto è adatto ad inizializzare array di piccole dimensioni. Viceversa, per<br />

inizializzare array relativamente grandi è più comodo utilizzare un ciclo DO implicito, il quale<br />

ha la seguente forma:<br />

(arg_1, arg_2, ..., indice = inizio, fine [, incremento])<br />

in cui arg_1, arg_2, ..., sono parametri che vengono calcolati ogni volta che il ciclo viene<br />

eseguito; indice è una variabile contatore il cui valore parte da inizio e termina a fine<br />

con uno step pari a incremento (con quest’ultimo pari ad uno per default). Ad esempio, la<br />

precedente dichiarazione di array poteva essere scritta, più semplicemente, come:<br />

INTEGER, DIMENSION(5) :: arr=(/(i, i=1,5)/)<br />

Allo stesso modo, un array reale di mille elementi può essere inizializzato con i valori 1, 2, ...,<br />

1000 utilizzando il seguente DO implicito:<br />

REAL, DIMENSION(1000) :: vett1=(/(REAL(i), i=1,1000)/)<br />

I cicli DO impliciti possono essere annidati o combinati con le costanti di array per creare<br />

schemi di inizializzazione più complessi. Ad esempio, la seguente istruzione imposta a zero gli<br />

elementi di vett2 se il loro indice non è divisibile per cinque, altrimenti gli elementi assumono<br />

i valori dei loro indici:<br />

INTEGER, DIMENSION(25) :: vett2=(/(0, i=1,4), 5*j, j=1,5)/)<br />

In questo caso, il ciclo interno (0, i=1,4) viene eseguito completamente ad ogni passaggio del<br />

ciclo esterno, pertanto lo schema dei valori risultante è il seguente:<br />

0, 0, 0, 0, 5, 0, 0, 0, 0, 10, 0, 0, 0, 0, 15, ...<br />

Analogo discorso vale per array di rango maggiore di uno. Ad esempio, volendo costruire, in<br />

fase di dichiarazione di tipo, una matrice ”identica” di tipo reale di 10×10 elementi, si può<br />

utilizzare la seguente istruzione:<br />

REAL, DIMENSION(10,10) :: mat_identica= &<br />

RESHAPE((/(1.0,(0.0,i=1,10),j=1,9),1.0),(/10,10/))

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

Saved successfully!

Ooh no, something went wrong!