- Il costrutto IF...THEN...ELSE...ENDIF, come pure
l'IF su una sola riga non presentano niente di nuovo in F90.
- Un'alternativa più limitata, ma più elegante nel caso di numerose
possibilità di scelta (e forse più ottimizzabile?) è il costrutto
CASE:
- è introdotto dall'istruzione
SELECT CASE (<expr>) dove
<expr> è un'espressione intera o carattere
- è formato da una o più clausole
CASE (<const-expr>) o
CASE (<const-expr1:const-expr2>) dove
const-expr e compagnia sono espressioni dello stesso tipo di
cui sopra ma costanti, quindi calcolabili al momento della
compilazione, che definiscono le istruzioni da eseguire nel caso in
cui <expr> sia uguale a <const-expr>
oppure sia compreso nell'intervallo
<const-expr1:const-expr2>
- può includere una clausola CASE DEFAULT che definisce le
istruzioni da eseguire nel caso nessuna delle altre clausole
CASE() sia stata soddisfatta
- le condizioni in ciascuna clausola CASE non possono
intersecarsi, in altre parole zero o al più una clausola CASE
può essere eseguita per ciascun valore in SELECT
- ovviamente termina con END SELECT.
L'utilità del costrutto SELECT è limitata, e riproducibile con
IF...THEN...ELSE...ENDIF, esso tuttavia è consigliato come
alternativa agli obsolescenti GOTO calcolato e IF
aritmetico del F77.
|
SUBROUTINE stampastaz(tipo, t1, t2, nl)
INTEGER :: tipo, nl
REAL :: t1(nl), t2(nl)
INTEGER, PARAMETER :: synop=1, ship=2, buoy=3, temp=4, pilot=5
SELECT CASE(tipo)
CASE(synop)
PRINT(A,F5.1)','Temperatura a 2m: ',t1(1)
CASE(ship:buoy)
PRINT(A,F5.1)','Temperatura a 2m: ',t1(1)
PRINT(A,F5.1)','Temperatura del mare: ',t2(1)
CASE(temp, pilot)
DO i = 1, nl
PRINT(A,F5.1)','Temperatura: ',t1(i)
PRINT(A,F5.1)','Temperatura di rugiada: ',t2(i)
ENDDO
CASE DEFAULT
PRINT'(A,I3,A)','Tipo di stazione', tipo, 'sconosciuto'
END SELECT
END SUBROUTINE stampastaz
|