FONDAMENTI DI INFORMATICA
Prof. PIER LUCA MONTESSORO Ing. DAVIDE PIERATTONI
Facoltà di Ingegneria
Università degli Studi di Udine
Linguaggio C
Debugging
inclusi, ma non limitatamente, ogni immagine, fotografia, animazione, video, audio, musica e testo) sono di proprietà degli autori prof. Pier Luca Montessoro e ing. Davide Pierattoni, Università degli Studi di Udine.
Le slide possono essere riprodotte ed utilizzate liberamente dagli istituti di ricerca, scolastici ed universitari afferenti al Ministero della Pubblica Istruzione e al Ministero dell’Università e Ricerca Scientifica e Tecnologica, per scopi istituzionali, non a fine di lucro. In tal caso non è richiesta alcuna autorizzazione.
Ogni altro utilizzo o riproduzione (ivi incluse, ma non limitatamente, le riproduzioni su supporti magnetici, su reti di calcolatori e stampe) in toto o in parte è vietata, se non esplicitamente autorizzata per iscritto, a priori, da parte degli autori.
L’informazione contenuta in queste slide è ritenuta essere accurata alla data della pubblicazione. Essa è fornita per scopi meramente didattici e non per essere utilizzata in progetti di impianti, prodotti, reti, ecc. In ogni caso essa è soggetta a cambiamenti senza preavviso. Gli autori non assumono alcuna responsabilità per il contenuto di queste slide (ivi incluse, ma non limitatamente, la correttezza, completezza, applicabilità, aggiornamento dell’informazione).
In ogni caso non può essere dichiarata conformità all’informazione contenuta in queste slide.
In ogni caso questa nota di copyright e il suo richiamo in calce ad ogni slide non devono
Debugging
• Ogni programma, a qualunque livello di complessità, è soggetto ad errori di programmazione (“bug”)
• Gli errori lessicali e sintattici vengono rilevati da parte del compilatore, che fornisce all’utente dei messaggi contenenti il numero di riga e il tipo di errore trovato nel sorgente
• Alle volte i messaggi possono recare solo degli avvertimenti (“warning”), senza bloccare la
compilazione: in tale caso è bene rivedere la correttezza semantica delle istruzioni
• Un programma compilato senza “warning” non
garantisce affatto l’assenza di errori!
• Gli errori di traduzione di un algoritmo nelle
corrispondenti istruzioni in linguaggio C sono spesso difficili da individuare
• È sempre consigliabile:
– verificare la corrispondenza dell’algoritmo con le specifiche richieste al programma
– effettuare un’analisi ragionata del codice “sulla carta”, ripercorrendo mentalmente tutti i passi di programma
– esaminare le espressioni, specialmente quelle di controllo nei cicli iterativi
– controllare l’effettiva allocazione delle variabili e tutte le
operazioni di assegnamento
Debugging
• La compilazione condizionale offre un supporto molto semplice da usare in fase di debugging
#define DEBUG
…
int i = 0;
#ifdef DEBUG
printf ("Inizio ciclo while...\n");
#endif
while (i < 100);
{
#ifdef DEBUG
printf ("i vale %d\n", i);
#endif
printf ("Messaggio ripetuto 100 volte\n");
}
Il programma si ferma alla stampa del primo messaggio
→ qualcosa non va...
stampa dei valori delle variabili “critiche”
• Questa tecnica aiuta il programmatore a visualizzare i risultati degli step più complessi
• Quando si deve analizzare l’esecuzione dei cicli, è
consigliabile stampare i valori delle variabili usate come contatori → utile nel caso di operazioni sui vettori!
int a[10];
...
for (i = 1; i < 10; i++) {
if (a[i] < 0)
continue;
Non stamperà mai il valore di
a[0], primo elemento del
Debugging
• Un modo per individuare il “bug” precedente può essere:
#define DEBUG ...
int a[10];
...
for (i = 1; i < 10; i++) {
#ifdef DEBUG
printf (“Ora leggo a[%d]\n”, i);
#endif
if (a[i] < 0)
continue;
printf ("%d\n", a[i]);
}
Ecco l’errore! Ho sbagliato l’inizializzazione del
contatore nel ciclo for!