====== Esercitazione compilazione separata e librerie ====== ===== Esercizio 1: Libreria operazioni su vettori ===== Realizzare una libreria che fornisce alcune operazioni comuni su vettori: /** stampa a sullo standard output */ void print_v (double* a, int n); /** calcola c = a + b ; n da il numero di elementi dei tre vettori */ void sum_v (double* a, double* b, double* c, int n); /** calcola il prodotto vettoriale a[0]*b[0] + ...... a[n-1]*b[n-1] e lo restituisce come valore */ double innerprod_v (double* a, double* b, int n); /** calcola il massimo valore e lo restituisce l'indice del massimo viene scritto nella variabile di indirizzo m_i */ double max_v(double* a, int n, int* m_i); /** calcola il segmento di somma massima (vedi esercitazione del 25/03/2015) */ double ssm_v(double* a, int n, int* s_init, int* s_lung); In C 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' ''vect.h'' e la libreria si chiamera' ''libVect.a''. Procedere nel modo seguente: * Definire un file ''vect.h'' che contiene i prototipi delle funzioni implementate (quelle nel riquadro sopra) * Definire un file ''vect.c'' che contiene il codice che implementa le funzioni. * Generare il modulo oggetto ''vect.o'' che contiene il codice precompilato delle funzioni, da inserire nella libreria. Il modulo oggetto puo' essere creato con il comando ''gcc'' come segue $ gcc -Wall -pedantic -c vect.c * Creare la libreria con i lcomando ''ar'' come segue $ ar -r libVect.a vect.o Quando la creazione e' andata a buon fine per testarla creare un file ''main.c'' che contenga delle chiamate alle funzioni di libreria, ad esempio: #include "./vect.h" #define N 3 int main (void) { double a[N] = {3,4,5}, b[N] = {5, 1,7}, c[N]; sum_v(a,b,c,N); print_v(c,N); return 0; } notate che : * il main di test deve includere il file ''vect.h'', questo permette al compilatore di controllare i tipi delle chiamate al codice della libreria * in fase di compilazione per collegare (linking) il codice del nel file ''main.c'' a quello della libreria bisogna usare le opzioni ''-l'' e ''-L'' $ gcc -Wall -pedantic main.c -lVect -L. dove l'opzione ''-l'' indica il nome della libreria (non standard) da usare in fase di linking e l'opzione ''-L'' specifica la directory (non standard) dove cercarla (oltre alle directory standard tipo ''/usr/lib'').