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.

132 Array<br />

Se uno degli operandi è uno scalare, allora lo scalare viene ”trasferito” in un array compatibile<br />

con l’altro operando. Questa operazione di trasferimento (broadcasting) degli scalari<br />

è particolarmente utile nelle istruzioni di inizializzazione degli array. Ad esempio, una volta<br />

eseguito il seguente frammento di programma:<br />

REAL, DIMENSION(4) :: a=(/1.,2.,3.,4./)<br />

REAL, DIMENSION(4) :: c<br />

REAL, DIMENSION b=10<br />

c = a*b<br />

l’array c conterrà i valori: 10., 20., 30., 40.<br />

Molte funzioni intrinseche del linguaggio che sono utilizzate con i valori scalari accettano<br />

anche gli array come argomenti di input e restituiscono array in output. Queste funzioni si<br />

chiamano funzioni intrinseche di elemento in quanto operano sugli array elemento×elemento.<br />

Molte delle funzioni più comuni, comeABS,SQRT,SIN,COS,EXP eLOG, sono funzioni di elemento.<br />

Ad esempio, considerato l’array a definito come:<br />

REAL, DIMENSION(5) :: a=(/-1.,2.,-3.,4.,-5./)<br />

la funzione ABS(a) fornisce il risultato: (/1.,2.,3.,4.,5./). Dunque, un array può essere<br />

usato come argomento di procedure intrinseche allo stesso modo di uno scalare, con l’effetto<br />

che la procedura intrinseca verrà applicata, separatamente ed indipendentemente, a ciascun<br />

elemento dell’array. Come ulteriore esempio, dati due array a e b, l’istruzione:<br />

b=SQRT(a)<br />

applica l’operatore di radice quadrata a ciascun elemento dell’array a ed assegna il risultato<br />

all’array b. E’ chiaro che, nel caso in esame, gli array a e b dovranno essere compatibili. Allo<br />

stesso modo, dato una array di caratteri, ch, la seguente istruzione valuta la lunghezza della<br />

stringa escludendo i bianchi di coda da tutti gli elementi dell’array.<br />

length=LEN_TRIM(ch)<br />

Naturalmente procedure intrinseche possono essere applicate ad array di qualsiasi rango. Ad<br />

esempio, se a è un array tridimensionale di forma (/l,m,n/), allora SIN(a) sarà anch’esso un<br />

array di rango tre e forma (/l,m,n/), il cui (i,j,k)_mo elemento avrà valore SIN(a(i,j,k)),<br />

per ogni i=1,...,l, j=1,...,m, k=1,...,n. Analogo discorso vale per procedure non unarie;<br />

ad esempio, dati due array a e b avente rango unitario e stessa estensione, la funzione<br />

MAX(0,a,b) restituirà un array di rango uno e tale che il suo i_mo elemento avrà valore pari<br />

a MAX(0,a(i),b(i)).<br />

<strong>Il</strong> vantaggio di lavorare con istruzioni globali può essere facilmente compreso se si osservano<br />

i prossimi esempi, in cui si confrontano le soluzioni di tipici problemi di array processing risolti<br />

sia con operazioni programmate elemento×elemento che con meccanismi globali.<br />

Si considerino tre array monodimensionali, tutti di estensione pari a venti, a, b e c. Si<br />

assegni il valore zero a ciascun elemento, quindi, dopo una successiva fase esecutiva, si esegua<br />

l’assegnazione: a(i) = a(i)/3.1 + b(i)*SQRT(c(i)) per ogni valore di i.

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

Saved successfully!

Ooh no, something went wrong!