Questa è una vecchia versione del documento!
Indice
Esercitazione 2
Dove si sperimenta qualche tool e si approfondiscono alcune caratteristiche del C sequenziale: errno, perror …
Esercizio 1: preprocessing, compilazione e linking
Seguire l'esempio dei lucidi visti nella lezione di proprocessing, compilazione e linking verificando i vari passi utilizzando il programma esempio presentato ed i comandi descritti nei lucidi presentati a lezione
Esercizio 2: verificare gli accessi in memoria: valgrind
Verificare la correttezza degli accessi ai puntatori compiuti dalle funzioni su liste di interi della libreria libList.a 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 chiamamain.c
posso compilare con
bash$ gcc -Wall -pedantic -g -o prova main.c
- eseguire
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.
Esercizio 3: Manipolare ''errno'' e uso di ''perror()''
In C, la maggior parte delle funzioni di libreria che segnalano un errore settano anche la variabile globale errno
con dei codici definiti da diversi standard. I codici sono valori interi, definiti da opportune macro. Per vadere il loro valore eseguire
bash$ man errno
Dopo l'esecuzione di una funzione di libreria che imposta errno
e' possibile chiamare la funzione di libreria perror()
che ispeziona il valore di errno
e trasforma il valore numerico in un messaggio testuale comprensibile all'utente (vedere man perror
per il suo uso).
E' possibile manipolare errno
da programma includendo l'header errno.h
con
#include <errno.h>
L'esercizio richiede di essegnare a errno i valori EINTR EPERM EBUSY
e stampare i corrispondenti messaggi di errore usando perror()
.
Esercizio 4: Generazione numeri casuali
Generare N
numeri casuali interi nell'intervallo [0,K-1]
utilizzando le funzioni rand()
ed srand()
.
- Calcolare il numero di occorrenze
c_i
di ciascun interoi
nell'intervallo '[0,K-1]e stamparle sullo standard output * Per ogni
icalcolare la percentuale di occorrenze sulle occorrenze totali (
c_idiviso
N'') e stamparle sullo standard output - Esaminare le occorrenze degli interi nell'intervallo e verificare che sono piuttosto vicine fra di loro
- Che distribuzione hano i numeri generati ?