informatica:sol:laboratorio11:esercitazioni:esercitazione3
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:laboratorio11:esercitazioni:esercitazione3 [01/03/2011 alle 16:49 (15 anni fa)] – [Esercizio 1. Liste generiche in C] Susanna Pelagatti | informatica:sol:laboratorio11:esercitazioni:esercitazione3 [21/03/2011 alle 16:01 (14 anni fa)] (versione attuale) – [Esercizio 5. Approfondiamo l'uso di valgrind (e alcune opzioni utili di gcc ...)] Susanna Pelagatti | ||
---|---|---|---|
Linea 1: | Linea 1: | ||
- | ===== Esercizio | + | ====== Esercitazione 3 ====== |
- | 0.1) Compilare ed eseguire il seguente programma: | + | |
+ | Dove si approfondisce la conoscenza delle fasi di preprocessing, | ||
+ | |||
+ | ===== Esercizio | ||
+ | 1) Compilare ed eseguire il seguente programma: | ||
<code c> | <code c> | ||
#include < | #include < | ||
Linea 18: | Linea 22: | ||
Chi segnala un errore? E' fallita la fase di preprocessing, | Chi segnala un errore? E' fallita la fase di preprocessing, | ||
- | 0.2) Cosa accade se eliminiamo la linea | + | 2) Cosa accade se eliminiamo la linea |
<code c> | <code c> | ||
#include < | #include < | ||
Linea 24: | Linea 28: | ||
? A questo punto cosa va storto? Sapete interpretare i messaggi a video e stabilire chi li ha scritti e perche'? | ? A questo punto cosa va storto? Sapete interpretare i messaggi a video e stabilire chi li ha scritti e perche'? | ||
- | 0.3) Generare il modulo oggetto con | + | 3) Generare il modulo oggetto con |
< | < | ||
gcc -Wall -pedantic -c ff.c | gcc -Wall -pedantic -c ff.c | ||
Linea 31: | Linea 35: | ||
Utilizzare //objdump, nm, readelf// per capire cosa contengono la tabella di rilocazione, | Utilizzare //objdump, nm, readelf// per capire cosa contengono la tabella di rilocazione, | ||
- | 0.4) Usare l' | + | 4) Usare l' |
- | ===== Esercizio 1. Liste generiche in C ===== | ||
- | In questo esercizio si richiede di realizzare alcune funzioni che lavorano su liste generiche in C una lista generica e' rappresentata con la seguenti struct | + | |
+ | ===== Esercizio 2: 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 3: 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)) | ||
+ | </ | ||
+ | ===== Esercizio 4. Liste generiche in C ===== | ||
+ | |||
+ | In questo esercizio si richiede di realizzare alcune funzioni che lavorano su liste generiche in C. Una lista generica e' rappresentata con la seguenti struct | ||
<code c> | <code c> | ||
typedef struct elem { | typedef struct elem { | ||
Linea 54: | Linea 83: | ||
} list_t; | } list_t; | ||
</ | </ | ||
- | la prima struttura ('' | + | la prima struttura ('' |
- | La seconda struttura ('' | + | La seconda struttura ('' |
* '' | * '' | ||
- | * '' | + | * '' |
- | Si chiede di le funzioni che permettono di creare/ | + | Si chiede di realizzare |
Realizzare un main di test che prova ad istanziare la lista in due versioni: una prima a valori interi usando le seguenti funzioni per il confronto e la copia: | Realizzare un main di test che prova ad istanziare la lista in due versioni: una prima a valori interi usando le seguenti funzioni per il confronto e la copia: | ||
<code c> | <code c> | ||
Linea 91: | Linea 120: | ||
} | } | ||
</ | </ | ||
- | e poi con delle stringhe usando analoghe funzioni per la copia ed il confronto. | + | e una seconda che ha come chiavi |
- | ===== Esercizio | + | |
- | Usare le macro con parametri per definire una macro che somma (operatore +) i propri argomenti | + | ===== Esercizio |
+ | Compilare ed eseguire il codice seguente usando valgrind | ||
<code c> | <code c> | ||
- | # | + | #include < |
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | # | ||
+ | |||
+ | int main(void) | ||
+ | { | ||
+ | int * a; | ||
+ | int i; | ||
+ | |||
+ | if ( ( a = malloc(N*sizeof(int))) == NULL ) | ||
+ | return EXIT_FAILURE; | ||
+ | srand(time(NULL)); | ||
+ | i=0; | ||
+ | while (i<N) | ||
+ | { | ||
+ | |||
+ | a[++i]=rand()%2; | ||
+ | printf(" | ||
+ | } | ||
+ | printf(" | ||
+ | return EXIT_SUCCESS; | ||
+ | } | ||
</ | </ | ||
- | e testarla | + | che problemi vengono segnalati ? Perche' |
- | < | + | |
- | int SOMMA(int X,int Y, int Z); | + | Provare a compilare (dopo averlo salvato |
+ | < | ||
+ | bash$ gcc -O -pedantic -Wall -Wextra -Wformat=2 -ggdb -o exe file.c | ||
</ | </ | ||
+ | viene segnato qualcosa ? Perche' | ||
+ | Utilizzare le opzioni sopra e valgrind per analizzare il comportamento dei programmi in {{: | ||
+ | Attenzione: | ||
+ | * non confondete l' | ||
+ | * la '' | ||
+ | * L' | ||
+ | |||
+ | Il '' | ||
+ | comando) come default a seconda della compilazione a cui il compilatore stesso e` stato sottoposto. Mentre il risultato della compilazione - di | ||
+ | un programma corretto ;) - non viene influenzato da un punto di vista funzionale, l'uso di opzioni diverse o di versioni diverse del | ||
+ | compilatore puo` comportare una maggiore o minore capacita` di rilevazione di possibili " | ||
+ | (come anche una diversa capacita` di ottimizzazione - nel tempo o nello spazio - dell' | ||
+ | comportamento funzionalmente diverso se il codice sorgente contiene errori. | ||
- | ===== Esercizio 5: 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/laboratorio11/esercitazioni/esercitazione3.1298998178.txt.gz · Ultima modifica: 01/03/2011 alle 16:49 (15 anni fa) da Susanna Pelagatti