Entrambe le parti precedenti la revisioneRevisione precedenteProssima revisione | Revisione precedente |
informatica:sol:laboratorio19:esercitazionib:esercitazione3 [04/03/2019 alle 14:25 (6 anni fa)] – Massimo Torquati | informatica:sol:laboratorio19:esercitazionib:esercitazione3 [05/03/2019 alle 09:00 (6 anni fa)] (versione attuale) – Massimo Torquati |
---|
===== Esercizio 1: libtokenizer.a ===== | ===== 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 1 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 2 dell'Esercitazione 2 in modo che il programma main includa il file 'tokenizer.h' e faccia il linking la libreria statica '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 ===== | ===== Esercizio 2: libtokenizer.so ===== |
| |
Rifare l'esercizio 2 creando invece che una libreria statica una libreria dinamica ('libtokenizer.so'). | Rifare l'esercizio 2 creando invece che una libreria statica una libreria dinamica ('libtokenizer.so'). |
Verificarne il corretto caricamento in memoria | Verificarne il corretto caricamento in memoria spostando il file 'libtokenizer.so' nella directory /tmp. |
| |
| ===== Esercizio 3: macro ===== |
| Dato il seguente codice main C: |
| <code> |
| #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; |
| } |
| </code> |
| 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: |
| <code> |
| Stampo la matrice M: |
| 0 1 2 3 4 5 6 7 |
| 1 2 3 4 5 6 7 8 |
| 2 3 .... |
| </code> |
| |
| ===== Esercizio 4: somma da ===== |
| |
| Scrivere un programma C che implementa una funzione somma con la seguente segnatura: |
| <code> |
| int somma(int x); |
| </code> |
| |
| La funzione 'somma' aggiunge l'intero x letto da un file che contiene un intero per ogni riga al valore calcolato fino a quel momento, quindi ritorna la somma. Il nome del file è passato come argomento al 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'. |
| |
| |
| |
| |
| |