Strumenti Utente

Strumenti Sito


fisica:informatica:201415:esercitazioni:esercitazione8

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
fisica:informatica:201415:esercitazioni:esercitazione8 [03/02/2015 alle 16:07 (10 anni fa)] – [Esercizio 3: Altre funzioni su liste di double] Susanna Pelagattifisica:informatica:201415:esercitazioni:esercitazione8 [03/02/2015 alle 16:38 (10 anni fa)] (versione attuale) – [Esercizio 3: Altre funzioni su liste di double] Susanna Pelagatti
Linea 3: Linea 3:
 ===== Esercizio 1: Sequenze di double ===== ===== Esercizio 1: Sequenze di double =====
 Consideriamo il problema di leggere da standard input una sequenza di valori reali terminata da 0.0 creando la lista corrispondente di tipo Consideriamo il problema di leggere da standard input una sequenza di valori reali terminata da 0.0 creando la lista corrispondente di tipo
-<code>+<code c>
 typedef struct lista_d { typedef struct lista_d {
   double val;   double val;
Linea 10: Linea 10:
 </code> </code>
   * sviluppare un programma C che legge gli elementi dallo standard input usando una funzione   * sviluppare un programma C che legge gli elementi dallo standard input usando una funzione
-<code> +<code c
-double leggi_nuovo_valore(void)+double leggi_nuovo_valore(void);
 </code> </code>
-  inserendo ogni nuovo valore in testa alla lista e poi stampa la lista risultante sullo standard output+il programma inserisce ogni nuovo valore in testa alla lista e poi stampa la lista risultante sullo standard output
     * Modificare il precedente programma in modo da inserire ogni nuovo valore in coda alla lista stampando la lista risultante sullo standard output     * Modificare il precedente programma in modo da inserire ogni nuovo valore in coda alla lista stampando la lista risultante sullo standard output
 +
  
 ===== Esercizio 2: Funzioni di inserzione su liste di double ===== ===== Esercizio 2: Funzioni di inserzione su liste di double =====
 Consideriamo le funzioni Consideriamo le funzioni
-<code>+<code c>
 lista_d_t * inserisci_testa ( lista_d_t * l, double v); lista_d_t * inserisci_testa ( lista_d_t * l, double v);
 lista_d_t * inserisci_coda ( lista_d_t * l, double v); lista_d_t * inserisci_coda ( lista_d_t * l, double v);
Linea 29: Linea 30:
 ===== Esercizio 3: Altre funzioni su liste di double ===== ===== Esercizio 3: Altre funzioni su liste di double =====
 Implementare le seguenti funzioni in modo iterativo e ricorsivo: Implementare le seguenti funzioni in modo iterativo e ricorsivo:
-<code>+<code c>
 /** calcola e restituisce il massimo della lista l */ /** calcola e restituisce il massimo della lista l */
 double max ( lista_d_t * l); double max ( lista_d_t * l);
Linea 35: Linea 36:
 double somma ( lista_d_t * l); double somma ( lista_d_t * l);
 /** libera la memoria occupata dalla lista */ /** libera la memoria occupata dalla lista */
-void fee_list( lista_d_t * l);+void free_list( lista_d_t * l);
 /** cancella, se presente, l'elemento che contiene la prima occorrenza  /** cancella, se presente, l'elemento che contiene la prima occorrenza 
-del valore val dalla lista l(liberando la memoria sullo heap+del valore dalla lista l (liberando la memoria) 
 e restituisce la nuova lista */ e restituisce la nuova lista */
-lista_d_t * cancella ( lista_d_t * l, double v);+lista_d_t * cancella_uno ( lista_d_t * l, double v); 
 +/** cancella tutti gli elementi di valore 
 +del valore v dalla lista l (liberando la memoria)  
 +e restituisce la nuova lista */ 
 +lista_d_t * cancella_tutti ( lista_d_t * l, double v);
 </code> </code>
  
Linea 55: Linea 60:
   * inserire la chiamata alla funzione di libreria muntrace() alla fine della parte del programma C che vogliamo verificare   * inserire la chiamata alla funzione di libreria muntrace() alla fine della parte del programma C che vogliamo verificare
   * compilare il file da verificare con opzione ''-g'' per includere le informazioni di debugging. Ad esempio se il mio file si chiama ''main.c'' posso compilare con   * compilare il file da verificare con opzione ''-g'' per includere le informazioni di debugging. Ad esempio se il mio file si chiama ''main.c'' posso compilare con
-<code>+<code bash>
 bash$ gcc -Wall -pedantic -g -o prova main.c  bash$ gcc -Wall -pedantic -g -o prova main.c 
 </code> </code>
   * settare la variabile di ambiente ''MALLOC_TRACE'' al path del file in cui vogliamo che la ''mtrace()'' registri le informazioni sugli accessi di memoria. Ad esempio se voglio registrare le informazioni nel file ''./mtrace.out'' devo usare il comando   * settare la variabile di ambiente ''MALLOC_TRACE'' al path del file in cui vogliamo che la ''mtrace()'' registri le informazioni sugli accessi di memoria. Ad esempio se voglio registrare le informazioni nel file ''./mtrace.out'' devo usare il comando
-<code>+<code bash>
 bash$ export MALLOC_TRACE=./mtrace.out bash$ export MALLOC_TRACE=./mtrace.out
 </code> </code>
   * eseguire, nel nostro esempio con:   * eseguire, nel nostro esempio con:
-<code>+<code bash>
 bash$ ./prova bash$ ./prova
 </code> </code>
   * dopo l'esecuzione nel file ''./mtrace.out'' sono registrati gli accessi in formato testuale non facilmente comprensibile. Interpretarlo con l'utility mtrace. Ad esempio sempre riferendosi al nostro esempio invocare   * dopo l'esecuzione nel file ''./mtrace.out'' sono registrati gli accessi in formato testuale non facilmente comprensibile. Interpretarlo con l'utility mtrace. Ad esempio sempre riferendosi al nostro esempio invocare
-<code>+<code bash>
 bash$ mtrace ./prova ./mtrace.out  bash$ mtrace ./prova ./mtrace.out 
 </code> </code>
 questo rispondera' ''No memory leaks'' se tutta la memoria e' stata deallocata o fornira' indicazioni su dove e' stata allocata la mamoria rimasta da deallocare. questo rispondera' ''No memory leaks'' se tutta la memoria e' stata deallocata o fornira' indicazioni su dove e' stata allocata la mamoria rimasta da deallocare.
  
 +===== Esercizio 5: verificare gli accessi in memoria: valgrind =====
 +
 +Verificare la correttezza degli accessi ai puntatori compiuti dalle funzioni su liste  utilizzando ''valgrind''
 +Questo strumento permette fra l'altro di capire se tutte le variabili sono inizializzate prima del loro uso, se accediamo a memoria gia' deallocata o mai allocata e situazioni similari
 +
 +
 +Per fare questo procedere come segue:  
 +  * compilare il file da verificare con opzione ''-g'' per includere le informazioni di debugging. Ad esempio se il mio file si chiama ''main.c'' posso compilare con
 +<code bash>
 +bash$ gcc -Wall -pedantic -g -o prova main.c
 +</code>
 +  * eseguire
 +<code bash>
 +bash$ valgrind ./prova
 +</code>
 +in questo modo, a schermo verranno riportare le infrazioni rilevate. Ad esempio, //invalid read// o //invalid write// sono accessi in lettura o scrittura a memoria non allocata o gia' deallocata.
 +
 +''valgrind'' contiene moltissime opzioni, invitiamo gli studenti interessati ad esplorarle partendo dal[[http://valgrind.org/|sito]].
fisica/informatica/201415/esercitazioni/esercitazione8.1422979643.txt.gz · Ultima modifica: 03/02/2015 alle 16:07 (10 anni fa) da Susanna Pelagatti

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki