informatica:sol:laboratorio16:esercitazionib:esercitazione2
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 | ||
| informatica:sol:laboratorio16:esercitazionib:esercitazione2 [25/02/2016 alle 11:47 (10 anni fa)] – [Esercizio 4: Generazione numeri casuali] Susanna Pelagatti | informatica:sol:laboratorio16:esercitazionib:esercitazione2 [03/03/2016 alle 08:23 (10 anni fa)] (versione attuale) – [Esercizio 1: preprocessing, compilazione e linking] Susanna Pelagatti | ||
|---|---|---|---|
| Linea 2: | Linea 2: | ||
| - | Dove si sperimenta qualche tool e si approfondiscono alcune caratteristiche del C sequenziale: | + | Dove si sperimenta qualche tool e si approfondiscono alcune caratteristiche del C sequenziale: |
| - | ===== Esercizio 1: preprocessing, compilazione e linking ===== | + | ===== Esercizio 1: Preprocessing, compilazione e linking ===== |
| Seguire l' | Seguire l' | ||
| - | ===== Esercizio 2: verificare gli accessi in memoria: valgrind | + | ===== Esercizio 2: Creare ed usare una libreria di liste ===== |
| - | Verificare la correttezza degli accessi ai puntatori compiuti dalle funzioni | + | Realizzare una libreria che fornisce le operazioni |
| - | Questo strumento permette fra l' | + | |
| + | In C tipicamente per realizzare una libreria | ||
| + | Nel nostro caso l' | ||
| - | Per fare questo procedere come segue: | + | Procedere nel modo seguente: |
| - | * compilare il file da verificare con opzione | + | |
| + | * Definire un file '' | ||
| + | * Definire un file '' | ||
| + | * Generare | ||
| < | < | ||
| - | bash$ gcc -Wall -pedantic -g -o prova main.c | + | $ gcc -Wall -pedantic -c lista.c |
| </ | </ | ||
| - | * eseguire | + | * Creare la libreria con i lcomando '' |
| < | < | ||
| - | bash$ valgrind | + | $ ar -r libList.a lista.o |
| </ | </ | ||
| - | in questo modo, a schermo verranno riportare le infrazioni rilevate. Ad esempio, | + | |
| + | Quando la creazione e' andata | ||
| + | * il main di test dovra' includere il file '' | ||
| + | * in fase di compilazione utilizzare la libreria sviluppata con | ||
| + | < | ||
| + | $ gcc -Wall -pedantic main.c -lList -L. | ||
| + | </code> | ||
| + | dove l' | ||
| + | . | ||
| ===== Esercizio 3: Manipolare '' | ===== Esercizio 3: Manipolare '' | ||
| Linea 49: | Linea 63: | ||
| ===== Esercizio 5: Generazione numeri casuali con '' | ===== Esercizio 5: Generazione numeri casuali con '' | ||
| Ripetere l' | Ripetere l' | ||
| + | |||
| + | ===== Esercizio 6: 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 '' | ||
| + | Questo strumento permette fra l' | ||
| + | |||
| + | |||
| + | Per fare questo procedere come segue: | ||
| + | * compilare il file da verificare con opzione '' | ||
| + | < | ||
| + | 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 7: Ancora su -- Preprocessing, | ||
| + | 1) Compilare ed eseguire il seguente programma: | ||
| + | <code c> | ||
| + | #include < | ||
| + | #include < | ||
| + | |||
| + | int main (void) { | ||
| + | double x=3.0; | ||
| + | |||
| + | printf(" | ||
| + | return 0; | ||
| + | } | ||
| + | </ | ||
| + | salvato nel file //ff.c// con | ||
| + | < | ||
| + | gcc -Wall -pedantic ff.c | ||
| + | </ | ||
| + | Chi segnala un errore? E' fallita la fase di preprocessing, | ||
| + | |||
| + | 2) Cosa accade se eliminiamo la linea | ||
| + | <code c> | ||
| + | #include < | ||
| + | </ | ||
| + | ? A questo punto cosa va storto? Sapete interpretare i messaggi a video e stabilire chi li ha scritti e perche'? | ||
| + | |||
| + | 3) Generare il modulo oggetto con | ||
| + | < | ||
| + | gcc -Wall -pedantic -c ff.c | ||
| + | </ | ||
| + | |||
| + | Utilizzare //objdump, nm, readelf// per capire cosa contengono la tabella di rilocazione, | ||
| + | |||
| + | 4) Usare l' | ||
| + | |||
| + | |||
| + | |||
| + | |||
| + | ===== Esercizio 8: Macro con parametri, macro SOMMA ===== | ||
| + | Usare le macro con parametri per definire una macro che somma (operatore +) i propri argomenti | ||
| + | <code c> | ||
| + | #define SOMMA(X, | ||
| + | </ | ||
| + | e testarla in un opportuno main. Valutare le differenze con una funzione di prototipo | ||
| + | <code c> | ||
| + | int SOMMA(int X,int Y, int Z); | ||
| + | </ | ||
| + | |||
| + | |||
| + | |||
| + | ===== Esercizio 9: Macro con parametri, macro FATTORIALE ===== | ||
| + | |||
| + | Scrivere una macro con parametri che calcoli il fattoriale di un numero N, passato come parametro e ne stampi il risultato. Ad esempio, posso utilizzare la macro per calcolare il fattoriale di 4+1 con | ||
| + | <code c> | ||
| + | FATTORIALE(4+1) | ||
| + | </ | ||
| + | La macro non deve fare assunzioni su come verranno passati i parametri. | ||
| + | Che accade annidando due chiamate della macro? Ad esempio | ||
| + | <code c> | ||
| + | FATTORIALE(FATTORIALE(4+1)) | ||
| + | </ | ||
| + | |||
informatica/sol/laboratorio16/esercitazionib/esercitazione2.1456400829.txt.gz · Ultima modifica: 25/02/2016 alle 11:47 (10 anni fa) da Susanna Pelagatti
