Strumenti Utente

Strumenti Sito


fisica:informatica:201516:primoanno:esercitazione11

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).

fisica/informatica/201516/primoanno/esercitazione11.txt · Ultima modifica: 17/05/2016 alle 13:29 (3 anni fa) da Susanna Pelagatti