Programmare in C – Creare una libreria

Guida C

Programmazione C – come creare una libreria. Ogni libreria consiste di due parti: un file di intestazione e il file che contiene il codice.

Poiché le funzioni rand e bubble_sort del programma illustrato nella lezione precedente sono molto utili, probabilmente dovranno essere riutilizzate in nuovi programmi. Si possono quindi raggruppare queste funzioni in una utile libreria per facilitare il loro riuso.

Ogni libreria consiste di due parti: un file di intestazione e il file che contiene il codice. Il file di intestazione, che viene denotato con un suffisso .h, contiene informazioni sulla libreria che i programmi che la useranno hanno necessità di conoscere. In generale, il file intestazione contiene costanti e tipi, assieme a prototipi per le funzioni disponibili nella libreria. Digitare quindi il seguente file di intestazione e salvarlo in un file nominato util.h

/* util.h */
extern int rand();
extern void bubble_sort(int, int []);

Queste due linee sono prototipi di funzioni. La parola extern in C rappresenta funzioni che verranno collegate/linkate in un momento successivo. Se si sta usando un compilatore “vecchia maniera”, eliminare le parentesi dalla lista dei parametri della funzione bubble_sort.

Digitare il seguente codice in un file chiamato util.c

/* util.c */
#include "util.h"

int rand_seed=10;

/* from K&R
 - produces a random number between 0 and 32767.*/
int rand()
{
    rand_seed = rand_seed * 1103515245 +12345;
    return (unsigned int)(rand_seed / 65536) % 32768;
}

void bubble_sort(int m,int a[])
{
    int x,y,t;
     for (x=0; x < m-1; x++)
        for (y=0; y < m-x-1; y++)
            if (a[y] > a[y+1])
            {
                t=a[y];
                a[y]=a[y+1];
                a[y+1]=t;
            }
}

Da notare che il file include il suo proprio file di intestazione (util.h) e questo viene incluso fra doppi apici invece che fra i simboli di maggiore e minore, questi ultimi sono usati solo per le librerie di sistema.

Come si può vedere, sembra normale codice C. Da notare anche la variabile rand_seed, poiché non si trova nel file di intestazione, non può essere vista o modificata da un programma usando questa libreria. Questo fenomeno si chiama “information hiding”, ossia protezione delle informazioni. Aggiungere la parola static davanti alla parola int rafforza la protezione delle informazioni.

Digitate quindi il seguente programma in un file chiamano main.c

#include <stdio.h>
#include "util.h"

#define MAX 10

int a[MAX];

void main()
{
    int i,t,x,y;
    /* fill array */
    for (i=0; i < MAX; i++)
    {
        a[i]=rand();
        printf("%d\n",a[i]);
    }

    bubble_sort(MAX,a);

    /* print sorted array */
    printf("--------------------\n");
    for (i=0; i < MAX; i++)
        printf("%d\n",a[i]);
}

Questo codice include la libreria di utility che abbiamo creato. Il maggior beneficio che si ottiene usando una libreria è che il codice nel programma principale è molto più corto.

Compilare ed eseguire il codice con una libreria

Per compilare la libreria, digitare a linea di comando (nell'ipotesi di macchina UNIX e compilatore gcc)
gcc -c -g util.c

L'opzione -c fa sì che il compilatore produca un file oggetto per la libreria. Il file oggetto contiene il codice macchina della libreria. Esso non può essere eseguito finchè non viene linkato/collegato ad un programma contenente una funzione main, detta anche funzione principale. Il codice macchina risiede in un file separato chiamto util.o.

Per compilare il programma principale, digitare a linea di comando

gcc -c -g main.c

Questa linea crea un file chiamato main.o che contiene il codice macchina per il programma principale. Per creare il file eseguibile finale che contiene il codice macchina per l'intero programma, collegare i due file oggetto digitando il seguente comando.

gcc -o main main.o util.o

Questo comando collega main.o con util.o per formare un eseguibile chiamato main. Per eseguire main, digitare main da linea di comando.

Per lavorare con maggior semplicità sulle librerie, si possono utilizzare i makefiles, dei quali parleremo nella prossima lezione.

STAMPA     Tags:,

Leave a Reply