Entrambe le parti precedenti la revisioneRevisione precedenteProssima revisione | Revisione precedente |
informatica:sol:laboratorio21:esercitazionib:esercitazione2 [22/02/2021 alle 17:49 (4 anni fa)] – Massimo Torquati | informatica:sol:laboratorio21:esercitazionib:esercitazione2 [25/02/2021 alle 15:25 (4 anni fa)] (versione attuale) – Massimo Torquati |
---|
===== Esercizio 2: puntatori a funzioni ===== | ===== Esercizio 2: puntatori a funzioni ===== |
| |
Estendere l'esercizio 1 associando ad ogni opzione del main una funzione che ne faccia la gestione e la stampa sullo standard output. Ad esempio, la gestione dell'opzione '-n' viene fatta dalla funzione 'arg_n(const char*)' la quale convertirà l'argomento associato all'opzione ad intero e farà la stampa sullo standard output. | Estendere l'esercizio 1 associando ad ogni opzione del main una funzione che ne faccia la gestione e la stampa sullo standard output. Ad esempio, la gestione dell'opzione '-n' viene fatta dalla funzione 'arg_n(const char*)' la quale convertirà l'argomento associato all'opzione ad intero e farà la stampa sullo standard output, ritornado -1 in caso di errore e 0 in caso di successo. |
Memorizzare tali funzioni in un vettore con nome 'V'. Utilizzare completando il seguente frammento di codice main. | Memorizzare tali funzioni in un vettore con nome 'V'. Utilizzare completando il seguente frammento di codice main. |
| |
... // controllo di argc ed inizializzazione del vettore V con i puntatori a funzione | ... // controllo di argc ed inizializzazione del vettore V con i puntatori a funzione |
| |
| int opt; |
while ((opt = getopt(argc,argv, "n:m:o:h")) != -1) { | while ((opt = getopt(argc,argv, "n:m:o:h")) != -1) { |
switch(opt) { | switch(opt) { |
Riscrivere il programma precedente (che produce un output non corretto) utilizzando la chiamata di libreria ''strtok_r'' al posto di ''strtok''. | Riscrivere il programma precedente (che produce un output non corretto) utilizzando la chiamata di libreria ''strtok_r'' al posto di ''strtok''. |
| |
**NOTA**: se si utilizza l'opzione ''-std=c99/11'', per evitare i warnings del tipo "implicit declaration of function X" aggiungere la seguente opzione di compilazione "-D_POSIX_C_SOURCE=200112L", oppure inserire la seguente define **prima del primo include**: | **NOTA**: se si utilizza lo standard ISO 99 o 11 (-std=c99/11), per evitare i warnings del tipo "implicit declaration of function X" aggiungere la seguente opzione di compilazione "-D_POSIX_C_SOURCE=200112L", oppure dichiarare il prototipo della funzione (copiando la segnatura dal man della funzione), oppure inserire la seguente define **prima del primo include**: |
<code> | <code> |
#define _POSIX_C_SOURCE 200112L | #define _POSIX_C_SOURCE 200112L |
</code> | </code> |
| |
===== Esercizio 4: valgrind ===== | ===== Esercizio 5: valgrind ===== |
| |
Verificare la correttezza degli accessi in memoria utilizzando ''valgrind'' dei programmi realizzati nell'esercizio 1 e 2. Verificare che non ci siano "memory leaks" all'uscita del programma. | Verificare la correttezza degli accessi in memoria utilizzando ''valgrind'' dei programmi realizzati nell'esercizi precedenti. Verificare che non ci siano "memory leaks" all'uscita del programma. |
| |
Valgrind permette, fra l'altro, di capire se le variabili sono inizializzate prima del loro uso, se accediamo a memoria gia' deallocata o mai allocata o a zone non inizializzate. | Valgrind permette, fra l'altro, di capire se le variabili sono inizializzate prima del loro uso, se accediamo a memoria gia' deallocata o mai allocata o a zone non inizializzate. |
in questo modo, a schermo verranno riportare le infrazioni rilevate nell'accesso alla memoria. Ad esempio, //invalid read// o //invalid write// sono accessi in lettura o scrittura a memoria non allocata o gia' deallocata. | in questo modo, a schermo verranno riportare le infrazioni rilevate nell'accesso alla memoria. Ad esempio, //invalid read// o //invalid write// sono accessi in lettura o scrittura a memoria non allocata o gia' deallocata. |
| |
Con l'opzione ''--leak-check=full'' (attenzione al doppio trattino iniziale), valgrind fornirà dettagli per ogni blocco di memoria che non è più raggiungibile o che, pur essendo raggiungibile, non è stato liberato, dando anche l'informazione di dove il blocco è stato allocato. | Con l'opzione ''--leak-check=full'' (attenzione, davanti a leek c'e' un doppio '-'), valgrind fornirà dettagli per ogni blocco di memoria che non è più raggiungibile o che, pur essendo raggiungibile, non è stato liberato, dando anche l'informazione di dove il blocco è stato allocato. |
| |