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:
vect.h
che contiene i prototipi delle funzioni implementate (quelle nel riquadro sopra)vect.c
che contiene il codice che implementa le funzioni.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
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 :
vect.h
, questo permette al compilatore di controllare i tipi delle chiamate al codice della libreriamain.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
).