• Non ci sono risultati.

Gestione elementare del colore

Nel documento Imparare il C una guida per Linux (pagine 142-148)

Per una gestione pienamente soddisfacente della grafica da terminale, si con-siglia l’impiego delle librerie Curses e si rimanda alla documentazione di queste ultime. Ci si ripropone di trattarle in questa sede in una versione successiva del presente documento.

Per una gestione abbastanza portabile del colore, `e possibile impiegare i codici di escape per comunicare alla console che si vuole stampare a video impiegando un certo colore. I codici di escape, come tutti i caratteri speciali, sono preceduti da un carattere backslash e contraddistinti dal carattere e.

Il segmento di codice sotto, seguendo sempre la filosofia che un esempio valga pi`u di mille parole, fa s`ı che la scritta aaa venga stampata a video in vari colori, corrispondenti ai codici di escape che compaiono nel listato.

1 #include<stdio.h> 2 int main() 3 { 4 printf("\e[1;30m \n\t aaa\n\n\e[00m"); 5 printf("\e[1;31m \n\t aaa\n\n\e[00m"); 6 printf("\e[1;32m \n\t aaa\n\n\e[00m"); 7 printf("\e[1;33m \n\t aaa\n\n\e[00m"); 8 printf("\e[1;34m \n\t aaa\n\n\e[00m"); 9 printf("\e[1;35m \n\t aaa\n\n\e[00m"); 10 printf("\e[1;36m \n\t aaa\n\n\e[00m"); 11 printf("\e[1;37m \n\t aaa\n\n\e[00m"); 12 printf("\e[1;38m \n\t aaa\n\n\e[00m"); 13 printf("\e[1;39m \n\t aaa\n\n\e[00m"); 14 printf("\e[0;30m \n\t aaa\n\n\e[00m"); 15 printf("\e[0;31m \n\t aaa\n\n\e[00m"); 16 printf("\e[0;32m \n\t aaa\n\n\e[00m");

120 CAPITOLO 15. GESTIONE ELEMENTARE DEL COLORE 17 printf("\e[0;33m \n\t aaa\n\n\e[00m"); 18 printf("\e[0;34m \n\t aaa\n\n\e[00m"); 19 printf("\e[0;35m \n\t aaa\n\n\e[00m"); 20 printf("\e[0;36m \n\t aaa\n\n\e[00m"); 21 printf("\e[0;37m \n\t aaa\n\n\e[00m"); 22 printf("\e[0;38m \n\t aaa\n\n\e[00m"); 23 printf("\e[0;39m \n\t aaa\n\n\e[00m"); 24 printf("\e[3;30m \n\t aaa\n\n\e[00m"); 25 printf("\e[3;31m \n\t aaa\n\n\e[00m"); 26 printf("\e[3;32m \n\t aaa\n\n\e[00m"); 27 printf("\e[3;33m \n\t aaa\n\n\e[00m"); 28 printf("\e[3;34m \n\t aaa\n\n\e[00m"); 29 printf("\e[3;35m \n\t aaa\n\n\e[00m"); 30 printf("\e[3;36m \n\t aaa\n\n\e[00m"); 31 printf("\e[3;37m \n\t aaa\n\n\e[00m"); 32 printf("\e[3;38m \n\t aaa\n\n\e[00m"); 33 }

Si provi a compilarlo e... a fargli stampare qualcosa di differente (e deci-samente pi`u utile ai propri scopi).

Capitolo 16

Errori

Durante l’esecuzione di un programma possono verificarsi molti eventi c che comportano il verificarsi di errori in run time. Ad esempio se vogliamo acce-dere in lettura ad un file che per`o, prima della chiamata alla funzione relativa, `e stato eliminato per qualche ragione dal sistema si produrr`a un’errore.

La corretta gestione degli errori `e dunque estremamente importante, so-prattutto se il nostro programma interagisce pesantemente col sistema. Si faccia ben attenzione al termine gestione, esso non `e utilizzato casualmente. Se, infatti, parte degli errori che possono verificarsi durante l’esecuzione di un programma `e evitabile magari modificando parte del codice, una buona per-centuale di essi non lo `e, per questo motivo occorre saper gestire le condizioni d’errore che possono presentarsi inevitabilmente in modo tale che queste non comportino l’arresto del programma quando non necessario. Nel caso esposto poco sopra, ad esempio, verificatosi l’errore si sarebbe potuto stampare a vi-deo il messaggio “file non trovato” e magari mettere il programma in attesa di un nuovo nome di file in input.

Le funzioni messe a disposizione dalle librerie GNU C prevedono la gestio-ne degli errori che possono verificarsi durante l’esecuziogestio-ne di un programma, infatti in genere tali funzioni ritornano un valore indicante il fallimento della chiamata (spesso -1). Tuttavia, per comprendere il genere di errore verificato-si comprenderete che il valore -1 non `e d’aiuto, per questo motivo, includendo l’apposito file header errno.h , `e possibile sfruttare la variabile errno

16.1 La variabile errno

All’interno del file header errno.h `e dichiarata la variabile errno . Si trat-ta fondamentrat-talmente di un intero che assume determinati valori a seconda del verificarsi di vari generi di errori. Quindi sarebbe opportuno che si

esa-122 CAPITOLO 16. ERRORI minasse la variabile errno ad ogni chiamata di sistema per poter ottenere utili informazioni. `E importante notare che delle volte, per alcune funzioni, la variabile errno risulta l’unico metodo veramente attendibile per verificare se la chiamata ha avuto successo o meno, pensate infatti a cosa accadrebbe se il valore -1 fosse un valore accettabile e quindi non denotante una condi-zione di errore. Casi di questo tipo sono presenti per funzioni che gestiscono la priorit`a dei processi e per le quali si rimanda al capitolo sulle risorse di sistema.

Le funzioni offerte dalle librerie GNU C impostano il valore di errno ad una macro la quale sar`a successivamente espansa in un determinato codice. Per vedere a quali codici una macro si riferisce e per avere un ’elenco delle macro disponibili il consiglio `e quello di analizzare i vari files errno.h presenti sul sistema, troverete in poco tempo quello che cercate. Per una descrizione di tutte le macro presenti invece rimandiamo alle pagine di manuale pur avendo queste dei nomi autoesplicativi ed essendo prese in considerazione spesso per le funzioni che tratteremo.

16.2 Funzioni per la gestione degli errori

16.2.1 La funzione strerror

Function: char * strerror (int ERRNUM)

Dichiarata nel file string.h questa funzione accetta come parametro il valore di errno esplicitando in seguito la causa dell’errore nella stringa restituita.

16.2.2 La funzione perror

Function: void perror (const char *MESSAGE)

La funzione in questione pu`o essere pensata come una sorta si printf, la dif-ferenza sostanziale risiede nel fatto che invece di emettere la stringa passata come parametro attraverso lo standard output essa viene emessa attraver-so lo standard error . Ci`o `e particolarmente interessante se si pensa che da console `e possibile redirigere solamente lo standard error attraverso l’uso di 2>. Pensate infatti al caso, non molto raro se usate Linux, in cui ricompilia-te un programma: attraverso lo standard output vengono emessi in rapida sequenza tutta una serie di messaggi. Tra questi eventuali errori potrebbero passare inosservati o comunque andrebbero persi nel caos. `E quindi buona

16.2 Funzioni per la gestione degli errori Imparare il C pag. 123 abitudine redirigere lo standard error su un normale file di testo in modo tale da poterlo analizzare alla fine della compilazione. Un esempio potrebbe essere:

$make 2> errori.txt

Ma non `e finita qui, perror stampa anche messaggio relativo alla variabile errno. Occorre quindi aver cura di utilizzare perror solo in caso di errore altrimenti si potrebbe essere tratti in inganno. Perror `e dichiarata nel file header stdio.h

16.2.3 La funzione error

Function: void error (int STATUS, int ERRNUM, const char *FORMAT, ...)

Le funzioni precedentemente trattate rispettano lo standard ANSI C e come tali sono portabili su qualsiasi piattaforma. Tuttavia delle volte `e necessa-rio ricavare maggiori informazioni sull’errore verificatosi. Per questo esistono delle funzioni particolari, non appartenenti allo standard ANSI C, molto uti-li. error `e tra queste, ed `e definita in error.h . Qualora il valore di STATUS fosse diverso da zero la chiamata a questa funzione causer`a l’uscita dal pro-gramma altrimenti ritorner`a 0. Il codice che descrive l’errore `e in questo caso passato in maniera esplicita con la variabile ERRNUM cui segue una stringa definita dall”utente. Questa funzione stampa anche il nome del programma chiamante. L’output generato `e emesso attraverso lo standard error.

Vi sono anche altre funzioni per la gestione degli errori ma riteniamo per ora sufficiente utilizzare quelle sopra riportate facendo bene attenzione al caso in cui il vostro programma debba essere compilato su pi´u piattaforme.

Capitolo 17

Nel documento Imparare il C una guida per Linux (pagine 142-148)

Documenti correlati