Il concetto di Dispositivi di Output in Fortran
Il Fortran è un linguaggio di programmazione dalla lunga storia. È stato sviluppato per la prima volta negli anni '50, quando i computer erano molto diversi da quelli che usiamo oggi.
Per questo motivo, il linguaggio supporta alcune funzionalità che possono sembrare obsolete o strane ai programmatori moderni. Una di queste funzionalità è l'uso dei dispositivi di output per controllare la formattazione dell'output di un programma.
Anche se oggi non sono più usate (e sono deprecate a partire dallo standard Fortran 2003), è bene conoscerle soprattutto perché si potrebbe trovare codice scritto in passato che le utilizza.
Fortran e Dispositivi di Output
Per comprendere la struttura di un'istruzione format
, dobbiamo sapere qualcosa sui dispositivi di output su cui verranno visualizzati i nostri dati.
L'output di un programma Fortran viene mostrato su un dispositivo di output. Esistono molti tipi di dispositivi di output utilizzati con i computer. Alcuni producono copie cartacee permanenti dei dati, mentre altri li visualizzano solo temporaneamente per permetterci di vederli. I dispositivi di output più comuni includono stampanti laser, stampanti a riga e monitor.
Il modo tradizionale per ottenere una copia cartacea dell'output di un programma Fortran era tramite una stampante a riga.
Una stampante a riga era un tipo di stampante che prendeva il nome dal fatto che stampava una riga di dati alla volta. Poiché è stato il primo dispositivo di output comunemente usato nei computer, le specifiche di output di Fortran sono state progettate pensando a essa. Gli altri dispositivi di output più moderni sono generalmente progettati per essere compatibili con le stampanti a riga, così da poter usare le stesse istruzioni di output su qualsiasi dispositivo.
La Console come Stampante a Riga Virtuale
Si pensi, ad esempio, alla console di un computer. La console è un dispositivo di output che visualizza i dati sullo schermo. Anche se la console non stampa su carta, può essere considerata una stampante a riga virtuale. Quando si usa la console come dispositivo di output, i dati vengono visualizzati su schermo una riga alla volta, proprio come se fossero stampati su carta.
Man mano che le righe successive vengono stampate, le righe precedenti vengono spostate verso l'alto. Questo processo è noto come scrolling. Quando la riga in cima allo schermo viene spostata fuori dalla vista, viene persa. Questo è il motivo per cui la console è considerata una stampante a riga virtuale. Il comportamento di output è lo stesso di una stampante a riga, ma i dati vengono visualizzati su schermo invece che su carta.
Una stampante a riga stampava su carta continua suddivisa in pagine. Tra le pagine c'erano delle perforazioni per facilitarne la separazione.
Ogni pagina era divisa in un certo numero di righe, e ogni riga era divisa in 132 colonne, con un carattere per colonna. Poiché la maggior parte delle stampanti a riga stampava 6 o 8 righe per pollice verticale, potevano stampare rispettivamente 60 o 72 righe per pagina (supponendo margini di 0,5 pollici in alto e in basso; margini maggiori riducevano il numero di righe stampabili).
Oggi, la maggior parte delle stampanti moderne sono stampanti laser, che stampano su fogli separati invece che su carta continua. Il formato della carta è solitamente "Letter" o "Legal" in Nord America, e A4 o A3 nel resto del mondo.
Le stampanti laser possono essere impostate per stampare 80 o 132 colonne a seconda della dimensione del testo, per cui possono essere compatibili con le stampanti a riga e rispondere allo stesso modo all'output dei programmi Fortran.
Il formato specifica dove una riga deve essere stampata su una pagina di stampante (posizione verticale), e anche dove ogni variabile deve essere stampata all'interno della riga (posizione orizzontale).
Caratteri di Controllo nell'Output della Stampante a Riga
Il computer crea un'immagine completa di ciascuna riga in memoria prima di inviarla a un dispositivo di output.
La memoria del computer contenente l'immagine della riga è chiamata buffer di output. Ai tempi delle stampanti a riga, il primo carattere di ogni riga aveva una funzione speciale ed era noto come carattere di controllo. Il carattere di controllo specificava la spaziatura verticale per la riga. I restanti 132 caratteri del buffer contenevano i dati da stampare in quella riga. Tutte le versioni di Fortran fino alla Fortran 95 compresa includevano un comportamento speciale per i caratteri di controllo.
Il carattere di controllo non veniva stampato sulla pagina dalla stampante a riga. Al contrario, forniva al dispositivo le informazioni per il posizionamento verticale. La Tabella seguente mostra la spaziatura verticale risultante dai diversi caratteri di controllo:
Carattere di controllo | Azione |
---|---|
1 | Vai a nuova pagina |
Spazio | Spaziatura singola |
0 | Spaziatura doppia |
+ | Nessuna spaziatura (sovrascrive riga) |
Il carattere di controllo era il primo carattere di ogni riga.
Un carattere '1'
faceva sì che la stampante saltasse il resto della pagina corrente e stampasse la riga in cima alla pagina successiva. Un carattere vuoto (spazio) faceva stampare la riga immediatamente sotto quella precedente, mentre un carattere '0'
faceva saltare una riga prima di stampare. Un carattere '+'
indicava di non usare spaziatura; in questo caso, la nuova riga sovrascriveva quella precedente. Se veniva utilizzato un altro carattere qualsiasi, il risultato era lo stesso di uno spazio.
Per l'output in formato libero, ossia usando write (*,*)
, veniva automaticamente inserito uno spazio come carattere di controllo all'inizio di ogni buffer di output. Pertanto, l'output diretto alla lista veniva sempre stampato con spaziatura singola.
Questo è il motivo per cui, ogniqualvolta usiamo write (*,*)
, vediamo uno spazio all'inizio di ogni riga di output.
Proviamo ad esaminare un esempio di output di un programma Fortran che utilizza caratteri di controllo. Vogliamo stampare la tabella che segue:
Misurazione | Valore |
---|---|
1 | 3.1416 |
2 | 2.7183 |
3 | 1.4142 |
Per stampare questa tabella, possiamo utilizzare le seguenti istruzioni Fortran:
character (len=80) :: fmt
fmt = "(I12, ' ', F10.4)"
write (*,100)
100 format ("1","Questa frase si trova all'inizio di una nuova pagina.")
write (*,110)
110 format ("0", "Misurazione Valore")
write (*,120)
120 format (" ", "=========== ========")
write (*,fmt) 1, 3.1416
write (*,fmt) 2, 2.7183
write (*,fmt) 3, 1.4142
Il risultato di questo programma è mostrato di seguito:
Questa frase si trova all'inizio di una nuova pagina.
Misurazione Valore
=========== ========
1 3.1416
2 2.7183
3 1.4142
I caratteri di controllo erano un meccanismo speciale progettato per funzionare con le stampanti a riga. Le stampanti a riga sono praticamente scomparse da molti anni, quindi l'uso della colonna 1 come carattere di controllo è stato eliminato dallo standard Fortran 2003.
Secondo il nuovo standard, la colonna 1 del buffer di output è un carattere ordinario senza alcuna funzione speciale. Viene stampato come qualsiasi altro carattere.
Infatti, eseguendo il programma precedente con un compilatore Fortran moderno, otterremo il seguente risultato:
1Questa frase si trova all'inizio di una nuova pagina.
0Misurazione Valore
=========== ========
1 3.1416
2 2.7183
3 1.4142
I Caratteri di Controllo nei Vecchi Programmi Fortran
Attenzione ai caratteri di controllo nei vecchi programmi Fortran e nei compilatori che supportano e modificano programmi obsoleti.
I compilatori Fortran supportano ancora questo meccanismo per compatibilità retroattiva, ma normalmente è disattivato per impostazione predefinita. Nei programmi Fortran moderni, il primo carattere di una riga non ha più un significato speciale.
In Sintesi
In questa lezione abbiamo imparato che:
- L'output di un programma Fortran viene mostrato su un dispositivo di output.
- I dispositivi di output più comuni includono stampanti laser, stampanti a riga e monitor.
- Una stampante a riga stampava su carta continua suddivisa in pagine.
- Il formato specifica dove una riga deve essere stampata su una pagina di stampante e dove ogni variabile deve essere stampata all'interno della riga.
- Il computer crea un'immagine completa di ciascuna riga in memoria prima di inviarla a un dispositivo di output.
- Il buffer di output contiene l'immagine della riga.
- Il carattere di controllo era il primo carattere di ogni riga e specificava la spaziatura verticale.
- I caratteri di controllo erano un meccanismo speciale progettato per funzionare con le stampanti a riga.
- Secondo lo standard Fortran 2003, la colonna 1 del buffer di output è un carattere ordinario senza alcuna funzione speciale.
Nella prossima lezione approfondiremo lo studio delle stringhe di formato e dei descrittori di formato in Fortran.