Questa è una vecchia versione del documento!
Indice
Esercitazione 3
Esercizio 1: libtokenizer.a
Inserire nel file 'tokenizer.h' l'interfaccia di due funzioni 'tokenizer' e 'tokenizer_r' (quest'ultima e' quella implementata nell'esercizio 4 dell'Esercitazione 2 mentre 'tokenizer' ha la stessa interfaccia di 'tokenizer_r' ma usa 'strtok' invece di strtok_r). Inserire nel file 'tokenizer.c' l'implementazione delle due funzioni. Creare quindi una librerie statica 'libtokenizer.a' e riscrivere il programma dell'esercizio 4 dell'Esercitazione 2 in modo che il programma main includa il file 'tokenizer.h' e faccia il linking della libreria statica 'libtokenizer.a'.
Esercizio 2: libtokenizer.so
Rifare l'esercizio 2 creando invece che una libreria statica una libreria dinamica ('libtokenizer.so'). Verificarne il corretto caricamento in memoria spostando il file 'libtokenizer.so' nella directory /tmp.
Esercizio 3: macro
Dato il seguente codice main C:
#define dimN 16 #define dimM 8 int main() { long *M = malloc(dimN*dimM*sizeof(long)); CHECK_PTR(M, "malloc"); for(size_t i=0;i<dimN;++i) for(size_t j=0;j<dimM;++j) ELEM(M,i,j) = i+j; PRINTMAT(M, dimN, dimM); return 0; }
scrivere le 3 macros CHECK_PTR
, ELEM
e PRINTMAT
.
'CHECK_PTR' prende due argomenti, un puntatore ed una stringa. La macro controlla che il primo argomento sia 'NULL' ed in tal caso stampa utilizzando la funzione di librerie perror
(man 3 'perror') la stringa passata come secondo argomento prima di uscire dal programma con EXIT_FAILURE
(man 3 'exit').
'PRINTMAT' stampa la matrice passata come primo argomento. Al suo interno PRINTMAT
usa la macro ELEM
per accedere agli elementi della matrice.
Esempio di output richiesto:
Stampo la matrice M: 0 1 2 3 4 5 6 7 1 2 3 4 5 6 7 8 2 3 ....
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 letto dallo standard input al valore calcolato fino a quel momento, quindi ritorna la somma parziale. Il numero di valori da leggere dallo standard input viene passato come argomento del main.
Il valore iniziale della somma deve essere 'INIT_VALUE' che viene definito a compilazione utilizzando il flag del compilatore -D
(es. -DINIT_VALUE=100). Il programma non deve fare uso di variabili globali.
Valutare se la funzione somma così come definita è rientrante ed eventualmente fornire una versione rientrante 'somma_r'.