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.

4.5 Descrittori non ripetibili 197<br />

4.5.5 I descrittori Tn, TRn e TLn<br />

I descrittori Tn , TRn , TLn sono chiamati descrittori di tabulazione in quanto permettono di<br />

specificare, mediante il valore della costante n (un intero positivo senza segno) che in essi compare,<br />

la posizione sul record corrente del successivo dato da trasmettere in I/O. In particolare,<br />

il descrittore Tn indica che l’operazione di lettura/scrittura deve continuare a partire dalla<br />

n _ma colonna del record corrente. Questo descrittore viene, pertanto, utilizzato per raggiungere<br />

direttamente una determinata posizione all’interno del buffer. Si noti che il descrittore Tn<br />

permette di raggiungere una posizione qualsiasi nella riga di output, anche oltre la posizione<br />

specificata dall’istruzione FORMAT. E’, tuttavia, necessario fare attenzione a non sovrapporre accidentalmente<br />

i campi dei dati da rappresentare. In fase di lettura il descrittore di formato Tn<br />

permette, così come anche nX, di ignorare, all’interno di un campo di input, quei dati che non<br />

si vogliono leggere; esso, inoltre, può permettere di leggere gli stessi dati due volte in formati<br />

diversi. Ad esempio il seguente frammento di programma legge due volte i dati dalla prima alla<br />

sesta colonna del buffer di input, una volta come intero e una volta come stringa di caratteri:<br />

INTEGER :: numero CHARACTER(LEN=6) :: parola READ(*,100) numero,<br />

parola 100 FORMAT(I6,T1,A6)<br />

In fase di scrittura, lo specificatore Tn consente di regolare la spaziatura e la posizione dei<br />

risultati prodotti nel record di uscita. Così, ad esempio, il seguente frammento di programma:<br />

INTEGER :: a = 9, b = 99, c = 999 CHARACTER(LEN=5) :: str = "ciao!"<br />

... WRITE(*,"(T8,I1,T5,I2,T1,I3,T25,A5)") a, b, c, str<br />

produce la stampa del record:<br />

999 99 9 ciao! ......................... 1 5 8<br />

25<br />

(per motivi di chiarezza nel record precedente si sono riportati graficamente anche i punti iniziali<br />

di ciascun valore prodotto).<br />

<strong>Il</strong> descrittore TRn [risp: TLn ], invece, fa sì che l’operazione di lettura/scrittura continui n<br />

colonne dopo [risp: prima di] quella attuale. In altre parole, detta p la posizione sul record<br />

corrente del carattere finale dell’ultimo campo utilizzato, il descrittore TRn indica che il campo<br />

destinato al prossimo dato inizia dalla posizione p +1+n mentre il descrittore TRn indica che il<br />

campo destinato al prossimo dato inizia dalla posizione p +1−n . Dunque TRn eTLn specificano<br />

di quante posizioni deve essere spostato, a destra e a sinistra rispettivamente, l’inizio del campo<br />

successivo rispetto alla posizione (p +1)_ma. <strong>Il</strong> descrittore TRn è, pertanto, equivalente ad nX<br />

mentre TLn è equivalente a T1 se risulta p +1−n ≤ 1. Si deve precisare che se il codice TL<br />

indica uno spostamento a sinistra oltre il primo carattere del record, si produce comunque lo<br />

spostamento del puntatore sul primo carattere de record.<br />

A titolo di esempio, si supponga che i sia una variabile intera e che char sia una variabile<br />

stringa di caratteri di lunghezza sette; l’istruzione di lettura:<br />

READ(*,250) i,string 250 FORMAT(T5,I4,TL4,A7)

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

Saved successfully!

Ooh no, something went wrong!