Questa è una vecchia versione del documento!
Indice
Esercitazione 3
Stringhe e libreria standard di IO, creazione di librerie statiche, macros, extern
e static
.
Esercizio 1: my word count
Scrivere un programma che realizzi l'equivalente del comando Unix wc
limitatamente alle opzioni -l e -w (man 1 wc). Usare getopt
per il parsing degli argomenti (man 3 getopt).
Se non vengono passate opzioni, il programma stampa sia il numero
di linee che il numero di parole del/dei file i cui nomi sono passati come argomento
(mywc [-l -w] file1 [file2 file3 ….]).
Esercizio 2: controllo errori
Scrivere una funzione macro 'CHECK_CALL_PTR' che prende due argomenti, un puntatore ed una stringa, e stampa utilizzando perror
l'errno
e la stringa passata come argomento prima di uscire dal programma con EXIT_FAILURE
. Esempio di utilizzo:
FILE *fp; CHECK_CALL_PTR(fp=fopen("fileprova.txt", "r"), opening fileprova.txt);
Se il file 'fileprova.txt' non esiste il risultato sarà:
opening fileprova.txt: No such file or directory
Stampare il valore di ritorno di un programma che testa la macro 'CHECK_CALL_PTR' sia in caso di successo che di fallimento (ricordare che il valore di ritorno dell'ultimo comando bash eseguito si può avere accedendo alla variabile di ambiente bash ?
).
Esercizio 3: matdump
Scrivere un programma che prende in ingresso un intero (piccolo, es. <html>⇐512</html>), alloca in memoria una matrice di 512×512 elementi float
in modo che siano contigui in memoria.
Inizializzare tale matrice (M1) in modo arbitrario (ad esempio M1(i,j) = (i+j)/2.0).
Fare quindi il dump della matrice in formato binario su un file il cui nome è 'mat_dump.dat'.
Rileggere quindi la matrice dal file 'mat_dump.dat' memorizzandola in una matrice differente
da quella di partenza (chiamata M2). Al termine dell'operazione di lettura effettuare il confronto delle due matrici con la funzione di libreria memcmp
(man 3 memcmp).
Esercizio 4: somma da
Scrivere un programma C che implementa una funzione somma con la seguente segnatura:
int somma(int x);
La funzione 'somma' aggiunge l'intero x (inserito dall'utente da stdin
) al valore calcolato fino a quel momento e ritornando la somma algebrica. Il programma termina quando viene inserito dall'utente un numero negativo.
Il valore iniziale della somma deve essere INIT_VALUE che viene definito a compilazione utilizzando il flag -D
. Il programma non deve fare uso di variabili globali.
Dare anche una implementazione rientrante della funziona 'somma' ('somma_r').