fisica:informatica:201415:esercitazioni:esercitazione8
Differenze
Queste sono le differenze tra la revisione selezionata e la versione attuale della pagina.
Prossima revisione | Revisione precedente | ||
fisica:informatica:201415:esercitazioni:esercitazione8 [03/02/2015 alle 12:51 (11 anni fa)] – creata 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 9: | Linea 9: | ||
} lista_d_t ; | } lista_d_t ; | ||
</ | </ | ||
- | stampare | + | * sviluppare un programma C che legge gli elementi dallo standard input usando una funzione |
+ | <code c> | ||
+ | double leggi_nuovo_valore(void); | ||
+ | </ | ||
+ | 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 | ||
- | ===== Esercizio 2: Funzioni su liste di double ===== | + | ===== Esercizio 2: Funzioni |
- | Considera | + | Consideriamo |
- | < | + | < |
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); | ||
lista_d_t * inserisci_ord ( lista_d_t * l, double v); | lista_d_t * inserisci_ord ( lista_d_t * l, double v); | ||
- | void free_list ( lista_d_t * l ); | ||
</ | </ | ||
discusse nella lezione sulle liste. | discusse nella lezione sulle liste. | ||
+ | * implementare le funzioni in modo iterativo sviluppando un programma main le utilizza per leggere una lista dallo standard input e stamparla ordinata sullo standard output | ||
+ | * implementare le funzioni in modo ricorsivo e verificare che il main sviluppato nel punto precedente continui a funzionare corerttamente | ||
+ | |||
+ | ===== Esercizio 3: Altre funzioni su liste di double ===== | ||
+ | Implementare le seguenti funzioni in modo iterativo e ricorsivo: | ||
+ | <code c> | ||
+ | /** calcola e restituisce il massimo della lista l */ | ||
+ | double max ( lista_d_t * l); | ||
+ | /** calcola e restituisce la somma di tutti gli elementi della lista l*/ | ||
+ | double somma ( lista_d_t * l); | ||
+ | /** libera la memoria occupata dalla lista */ | ||
+ | void free_list( lista_d_t * l); | ||
+ | /** cancella, se presente, l' | ||
+ | del valore v dalla lista l (liberando la memoria) | ||
+ | e restituisce la nuova lista */ | ||
+ | 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); | ||
+ | </ | ||
+ | |||
+ | e sviluppare un main() che ne testa il funzionamento. | ||
+ | |||
+ | ===== Esercizio 4: Verificare i memory leak con '' | ||
+ | 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 utilizzando '' | ||
+ | Questo strumento permette fra l' | ||
+ | |||
+ | |||
+ | 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.1422967877.txt.gz · Ultima modifica: 03/02/2015 alle 12:51 (11 anni fa) da Susanna Pelagatti