Entrambe le parti precedenti la revisioneRevisione precedenteProssima revisione | Revisione precedente |
informatica:sol:laboratorio20:esercitazionib:esercitazione3 [02/03/2020 alle 09:04 (5 anni fa)] – [Esercizio 1: libtokenizer.a] Massimo Torquati | informatica:sol:laboratorio20:esercitazionib:esercitazione3 [03/03/2020 alle 07:44 (5 anni fa)] (versione attuale) – [Esercizio 2: libtokenizer.so] Massimo Torquati |
---|
===== Esercizio 1: libtokenizer.a ===== | ===== Esercizio 1: libtokenizer.a ===== |
| |
Inserire in un file 'tokenizer.h' la dichiarazione di due funzioni 'tokenizer' e 'tokenizer_r' (vedere la soluzione proposta nell'Esercitazione 2). 'tokenizer' ha la stessa interfaccia di 'tokenizer_r' ma mentre la prima usa al suo interno 'strtok', la seconda usa 'strtok_r'. Inserire nel file 'tokenizer.c' l'implementazione delle due funzioni (cioè la loro definizione). Creare quindi una librerie statica 'libtokenizer.a' che offre l'implementazione delle due funzioni. Scrivere un programma main che utilizza una delle due o entrambe le funzioni, il programma includerà il file 'tokenizer.h' e verrà linkato alla libreria statica 'libtokenizer.a'. | Inserire in un file 'tokenizer.h' la dichiarazione di due funzioni 'tokenizer' e 'tokenizer_r' (vedere la soluzione proposta nell'Esercitazione 2). 'tokenizer' ha la stessa interfaccia di 'tokenizer_r' ma mentre la prima usa al suo interno 'strtok', la seconda usa 'strtok_r'. Inserire nel file 'tokenizer_lib.c' l'implementazione delle due funzioni (cioè la loro definizione). Creare quindi una librerie statica 'libtokenizer.a' che offre l'implementazione delle due funzioni. Scrivere un programma main (es. tokenizer_main.c) che utilizza una delle due (o entrambe le) funzioni, il programma includerà il file 'tokenizer.h' e verrà linkato alla libreria statica 'libtokenizer.a'. |
| |
===== Esercizio 2: libtokenizer.so ===== | ===== Esercizio 2: libtokenizer.so ===== |
| |
Rifare l'esercizio 2 creando invece che una libreria statica una libreria dinamica ('libtokenizer.so'). | Rifare l'esercizio 1 creando invece che una libreria statica una libreria dinamica ('libtokenizer.so'). |
Verificarne il corretto caricamento in memoria spostando il file 'libtokenizer.so' nella directory /tmp. | Verificarne il corretto caricamento in memoria della libreria spostando il file 'libtokenizer.so' in una directory differente da quella corrente (es. ~/mylibdir). Provare ad usare sia l'opzione del linker ''-Wl, rpath,'' che la variabile d'ambiente per il loader ''LD_LIBRARY_PATH''. |
| |
===== Esercizio 3: macro ===== | ===== Esercizio 3: macro ===== |
</code> | </code> |
| |
La funzione 'somma' aggiunge l'intero x letto dallo standard input al valore calcolato fino a quel momento, quindi ritorna la somma parziale. Il numero di valori da leggere dallo standard input viene passato come argomento del main. | La funzione 'somma' aggiunge l'intero x letto dallo standard input (con ''scanf'' o ''fscanf'') al valore calcolato fino a quel momento, quindi ritorna la somma parziale. Il numero di valori da leggere dallo standard input viene passato come argomento del main. |
Il valore iniziale della somma deve essere 'INIT_VALUE' che viene definito a compilazione utilizzando il flag del compilatore ''-D'' (es. -DINIT_VALUE=100). Il programma non deve fare uso di variabili globali. | Il valore iniziale della somma deve essere 'INIT_VALUE' che viene definito a compilazione utilizzando il flag del preprocessore ''-D'' (es. -DINIT_VALUE=100). Il programma non deve fare uso di variabili globali. |
| |
Valutare se la funzione somma così come definita è rientrante ed eventualmente fornire una versione rientrante 'somma_r'. | Valutare se la funzione somma così come definita è rientrante ed eventualmente fornire una versione rientrante 'somma_r'. |