Strumenti Utente

Strumenti Sito


informatica:sol:laboratorio21:esercitazionib:esercitazione2

Differenze

Queste sono le differenze tra la revisione selezionata e la versione attuale della pagina.

Link a questa pagina di confronto

Entrambe le parti precedenti la revisioneRevisione precedente
Prossima revisione
Revisione precedente
informatica:sol:laboratorio21:esercitazionib:esercitazione2 [22/02/2021 alle 17:49 (4 anni fa)] Massimo Torquatiinformatica:sol:laboratorio21:esercitazionib:esercitazione2 [25/02/2021 alle 15:25 (4 anni fa)] (versione attuale) Massimo Torquati
Linea 12: Linea 12:
 ===== 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.
  
Linea 20: Linea 20:
   ...  // 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) {
Linea 65: Linea 66:
 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
Linea 87: Linea 88:
 </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. 
Linea 101: Linea 102:
 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.
  
informatica/sol/laboratorio21/esercitazionib/esercitazione2.1614016195.txt.gz · Ultima modifica: 22/02/2021 alle 17:49 (4 anni fa) da Massimo Torquati

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki