Strumenti Utente

Strumenti Sito


informatica:sol:laboratorio16:esercitazionib:esercitazione2

Differenze

Queste sono le differenze tra la revisione selezionata e la versione attuale della pagina.

Link a questa pagina di confronto

Entrambe le parti precedenti la revisioneRevisione precedente
Prossima revisione
Revisione precedente
informatica:sol:laboratorio16:esercitazionib:esercitazione2 [25/02/2016 alle 11:41 (9 anni fa)] – [Esercizio 1: preprocessing, compilazione e linking] Susanna Pelagattiinformatica: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: errno, perror ...+Dove si sperimenta qualche tool e si approfondiscono alcune caratteristiche del C sequenziale: errno, perror creazione di librerie e generazione di numeri casuali
  
  
-===== Esercizio 1: preprocessing, compilazione e linking =====+===== Esercizio 1: Preprocessing, compilazione e linking =====
 Seguire l'esempio dei lucidi visti nella lezione di proprocessing, compilazione e linking verificando i vari passi utilizzando il programma esempio presentato ed i comandi descritti nei  {{:informatica:sol:laboratorio15:esercitazionib:c006prepcomplinkong.pdf|lucidi presentati a lezione}} Seguire l'esempio dei lucidi visti nella lezione di proprocessing, compilazione e linking verificando i vari passi utilizzando il programma esempio presentato ed i comandi descritti nei  {{:informatica:sol:laboratorio15:esercitazionib:c006prepcomplinkong.pdf|lucidi presentati a lezione}}
  
-===== Esercizio 2: verificare gli accessi in memoria: valgrind =====+===== Esercizio 2: Creare ed usare una libreria di liste ===== 
 + 
 +Realizzare una libreria che fornisce le operazioni su liste implementate negli esercizi 2 e 3 dell'[[informatica:sol:laboratorio16:esercitazionib:esercitazione1|esercitazione 1.]] 
 +  
 +In C tipicamente per realizzare una libreria si difinisce un file ''.h'' con i prototipi ed i tipi messi a disposizione dalla libreria e si fornisce il codice pre-compilato in un opportuno file di libreria ''.a''
 + 
 +Nel nostro caso l'header si chiamera' ''lista.h'' e la libreria si chiamera' ''libList.a''
 + 
 +Procedere nel modo seguente: 
 + 
 +  * Definire un file ''lista.h'' che contiene i tipi ed i prototipi delle funzioni implementate  
 +  * Definire un file ''lista.c'' che contiene il codice che implementa le funzioni. 
 +  * Generare il modulo oggetto ''lista.o'' da inserire nella libreria con il comando ''gcc'' come segue 
 +<code> 
 +$ gcc -Wall -pedantic -c lista.c 
 +</code> 
 +  * Creare la libreria con i lcomando ''ar'' come segue 
 +<code> 
 +$ ar -r libList.a lista.o 
 +</code> 
 + 
 +Quando la creazione e' andata a buon fine creare un file ''main.c'' che contenga uno dei main di test sviluppati negli esercizi precedenti e compilarlo utilizzando la libreria. In particolare : 
 +  * il main di test dovra' includere il file ''lista.h'' 
 +  * in fase di compilazione utilizzare la libreria sviluppata con 
 +<code> 
 +$ gcc -Wall -pedantic main.c -lList -L. 
 +</code> 
 +dove l'opzione ''-l'' indica il nome della libreria da usare in fase di linking e l'opzione ''-L'' specifica la directory dove cercarla (oltre alle directory standard tipo ''/usr/lib''). 
 +
 + 
 + 
 +===== Esercizio 3: Manipolare ''errno'' e uso di ''perror()'' ===== 
 + 
 +In C, la maggior parte delle funzioni di libreria che segnalano un errore settano anche la variabile globale ''errno'' con dei codici definiti da diversi standard. I codici sono valori interi, definiti da opportune macro. Per vadere il loro valore eseguire 
 +<code> 
 +bash$ man errno 
 +</code> 
 +Dopo l'esecuzione di una funzione di libreria che imposta ''errno'' e' possibile chiamare la funzione di libreria ''perror()'' che ispeziona il valore di ''errno'' e trasforma il valore numerico in un messaggio testuale comprensibile all'utente (vedere ''man perror'' per il suo uso).  
 +E' possibile manipolare ''errno'' da programma includendo l'header ''errno.h'' con 
 +<code c> 
 +#include <errno.h> 
 +</code> 
 + 
 +L'esercizio richiede di essegnare a errno i valori ''EINTR EPERM EBUSY'' e stampare i corrispondenti messaggi di errore usando ''perror()''
 + 
 +===== Esercizio 4: Generazione numeri casuali con ''rand()'' ed ''srand()'' =====  
 + 
 +Generare ''N'' numeri casuali interi nell'intervallo ''[0,K-1]'' utilizzando le funzioni ''rand()'' ed ''srand()''. N e K sono definiti con delle opportune ''#define''. Per ''N==100'' e ''K==4'' eseguire quanto segue. 
 +   * Calcolare il numero di occorrenze ''c_i'' di ciascun intero ''i'' nell'intervallo ''[0,K-1]''e stamparle sullo standard output 
 +  *     Per ogni ''i'' calcolare la percentuale di occorrenze sulle occorrenze totali (''c_i'' diviso ''N'') e stamparle sullo standard output 
 +  *  Esaminare le occorrenze degli interi nell'intervallo e verificare che sono piuttosto vicine fra di loro 
 +  *  Che distribuzione hano i numeri generati ? 
 + 
 +===== Esercizio 5: Generazione numeri casuali con ''rand_r()'' =====  
 +Ripetere l'esecizio 4 utilizzando la funzione ''rand_r()''. A che serve questa funzione ? Quali sono le principali differenze ? (//Suggerimento//: partire dall'analisi accurata del ''man''
 + 
 +===== 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 ''valgrind'' Verificare la correttezza degli accessi ai puntatori compiuti dalle funzioni su liste di interi della libreria libList.a utilizzando ''valgrind''
Linea 25: Linea 81:
 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. 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 3: Manipolare ''errno'' e uso di ''perror()'' ===== 
  
-In Cla maggior parte delle funzioni di libreria che segnalano un errore settano anche la variabile globale ''errno'' con dei codici definiti da diversi standardI codici sono valori interidefiniti da opportune macroPer vadere il loro valore eseguire+===== Esercizio 7: Ancora su -- Preprocessingcompilazione e linking ===== 
 +1) Compilare ed eseguire il seguente programma: 
 +<code c> 
 +#include <stdio.h> 
 +#include <math.h> 
 + 
 +int main (void) { 
 +  double x=3.0; 
 + 
 +  printf("Radice = %f\n",sqrt(x)); 
 +  return 0; 
 +
 +</code> 
 +salvato nel file //ff.c// con
 <code> <code>
-bash$ man errno+gcc -Wall -pedantic ff.c
 </code> </code>
-Dopo l'esecuzione di una funzione di libreria che imposta ''errno'' e' possibile chiamare la funzione di libreria ''perror()'' che ispeziona il valore di ''errno'' e trasforma il valore numerico in un messaggio testuale comprensibile all'utente (vedere ''man perror'' per il suo uso).  +Chi segnala un errore? Efallita la fase di preprocessing, la compilazione o il linking? Cosa contine il modulo oggetto se specifico l'opzione -c? Come si risolve il problema? 
-E' possibile manipolare ''errno'' da programma includendo l'header ''errno.h'' con+ 
 +2Cosa accade se eliminiamo la linea
 <code c> <code c>
-#include <errno.h>+#include <math.h>
 </code> </code>
 +? A questo punto cosa va storto? Sapete interpretare i messaggi a video e stabilire chi li ha scritti e perche'? Viene generato l'eseguibile?
  
-L'esercizio richiede di essegnare a errno i valori ''EINTR EPERM EBUSY'' e stampare i corrispondenti messaggi di errore usando ''perror()''.+3Generare il modulo oggetto con 
 +<code> 
 +gcc -Wall -pedantic -c ff.
 +</code>
  
-===== Esercizio 4Generazione numeri casuali ===== +Utilizzare //objdump, nm, readelf// per capire cosa contengono la tabella di rilocazione, la tabella dei simboli esportati ed esterni, le sezioni data, BSS e codice. (utilizzare il man e cercare su google). 
 + 
 +4) Usare l'opzione //-E// e la //-S// del gcc: che cosa succede? Cosa accade specificando il flag -g assieme a -S?  
 + 
 + 
 + 
 + 
 +===== Esercizio 8Macro con parametri, macro SOMMA ===== 
 +Usare le macro con parametri per definire una macro che somma (operatore +) i propri argomenti 
 +<code c> 
 +#define SOMMA(X,Y,Z) ...... 
 +</code> 
 +e testarla in un opportuno main. Valutare le differenze con una funzione di prototipo 
 +<code c> 
 +int SOMMA(int X,int Y, int Z); 
 +</code> 
 + 
 + 
 + 
 +===== 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) 
 +</code> 
 +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))  
 +</code>
  
-Generare ''N'' numeri casuali interi nell'intervallo ''[0,K-1]'' utilizzando le funzioni ''rand()'' ed ''srand()'' 
-  * Calcolare il numero di occorrenze ''c_i'' di ciascun intero ''i'' nell'intervallo '[0,K-1]''e stamparle sullo standard output 
-  * Per ogni ''i'' calcolare la percentuale di occorrenze sulle occorrenze totali (''c_i'' diviso ''N'') e stamparle sullo standard output 
-  * Esaminare le occorrenze degli interi nell'intervallo e verificare che sono piuttosto vicine fra di loro 
-  * Che distribuzione hano i numeri generati ? 
-  *  
informatica/sol/laboratorio16/esercitazionib/esercitazione2.1456400519.txt.gz · Ultima modifica: 25/02/2016 alle 11:41 (9 anni fa) da Susanna Pelagatti

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki