fisica:informatica:201415:esercitazioni:esercitazione8
Differenze
Queste sono le differenze tra la revisione selezionata e la versione attuale della pagina.
| Entrambe le parti precedenti la revisioneRevisione precedenteProssima revisione | Revisione precedente | ||
| fisica:informatica:201415:esercitazioni:esercitazione8 [03/02/2015 alle 13:08 (11 anni fa)] – Susanna Pelagatti | fisica:informatica:201415:esercitazioni:esercitazione8 [03/02/2015 alle 16:38 (11 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 | ||
| - | < | + | < |
| typedef struct lista_d { | typedef struct lista_d { | ||
| double val; | double val; | ||
| Linea 10: | Linea 10: | ||
| </ | </ | ||
| * 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 | ||
| - | < | + | < |
| - | double leggi_nuovo_valore(void) | + | double leggi_nuovo_valore(void); |
| </ | </ | ||
| - | inserendo | + | il programma inserisce |
| * 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 | ||
| - | < | + | < |
| 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 28: | Linea 29: | ||
| ===== Esercizio 3: Altre funzioni su liste di double ===== | ===== Esercizio 3: Altre funzioni su liste di double ===== | ||
| - | Implementare le seguenti funzioni: | + | Implementare le seguenti funzioni |
| - | < | + | < |
| /** 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' | + | /** cancella, se presente, l' |
| - | lista_d_t * cancella ( lista_d_t * l, double v); | + | del valore |
| + | e restituisce la nuova lista */ | ||
| + | lista_d_t | ||
| + | /** cancella | ||
| + | del valore v dalla lista l (liberando la memoria) | ||
| + | e restituisce la nuova lista */ | ||
| + | lista_d_t * cancella_tutti | ||
| </ | </ | ||
| e sviluppare un main() che ne testa il funzionamento. | e sviluppare un main() che ne testa il funzionamento. | ||
| - | ===== Esercizio 4: Verificare i memory leak con '' | + | ===== Esercizio 4: Verificare i memory leak con '' |
| - | Verificare | + | Con riferimento al main sviluppato per l' |
| + | |||
| + | Per la verifica si utilizzi la funzione '' | ||
| + | |||
| + | Per fare questo procedere come segue: | ||
| + | * leggere le informazioni in '' | ||
| + | * includere l' | ||
| + | * inserire la chiamata alla funzione di libreria mtrace() all' | ||
| + | * 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 '' | ||
| + | <code bash> | ||
| + | bash$ gcc -Wall -pedantic -g -o prova main.c | ||
| + | </ | ||
| + | * settare la variabile di ambiente '' | ||
| + | <code bash> | ||
| + | bash$ export MALLOC_TRACE=./ | ||
| + | </ | ||
| + | * eseguire, nel nostro esempio con: | ||
| + | <code bash> | ||
| + | bash$ ./prova | ||
| + | </ | ||
| + | * dopo l' | ||
| + | <code bash> | ||
| + | bash$ mtrace ./prova ./ | ||
| + | </ | ||
| + | questo rispondera' | ||
| + | |||
| + | ===== Esercizio 5: verificare gli accessi in memoria: valgrind ===== | ||
| + | |||
| + | Verificare la correttezza degli accessi ai puntatori compiuti dalle funzioni su liste | ||
| + | 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 '' | ||
| + | <code bash> | ||
| + | bash$ gcc -Wall -pedantic -g -o prova main.c | ||
| + | </ | ||
| + | * eseguire | ||
| + | <code bash> | ||
| + | bash$ valgrind ./prova | ||
| + | </ | ||
| + | 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. | ||
| + | |||
| + | '' | ||
fisica/informatica/201415/esercitazioni/esercitazione8.1422968913.txt.gz · Ultima modifica: 03/02/2015 alle 13:08 (11 anni fa) da Susanna Pelagatti
