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 (9 anni fa)] – [Esercizio 4: Generazione numeri casuali] Susanna Pelagatti | informatica:sol:laboratorio16:esercitazionib:esercitazione2 [03/03/2016 alle 08:23 (9 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 (9 anni fa) da Susanna Pelagatti