CREARE UNA LIBRERIA IN C



Documenti analoghi
2. Spiegare brevemente qual è la funzione del compilatore e la sua importanza per il programmatore.

Office 2007 Lezione 08

Università degli Studi di Cassino Corso di Fondamenti di Informatica Puntatori. Anno Accademico 2010/2011 Francesco Tortorella

Formattazione. ü Introduzione

Modulo 4 Il pannello amministrativo dell'hosting e il database per Wordpress

dall argomento argomento della malloc()

Laboratorio di Programmazione 1. Docente: dr. Damiano Macedonio Lezione 18 31/03/2014

[Dimensionare la pagina-creare le tabelle-formattare le tabelle-formattare la pagina

Tipi primitivi. Ad esempio, il codice seguente dichiara una variabile di tipo intero, le assegna il valore 5 e stampa a schermo il suo contenuto:

Politecnico di Torino

POSTA ELETTRONICA Per ricevere ed inviare posta occorrono:

Lezione 10: Librerie e compilazione separata

Funzioni in C. Violetta Lonati

PROCEDURA INVENTARIO DI MAGAZZINO di FINE ESERCIZIO (dalla versione 3.2.0)

Come realizzare i disegni in Autocad partendo da un immagine

Per scrivere una procedura che non deve restituire nessun valore e deve solo contenere le informazioni per le modalità delle porte e controlli

Capitolo 3. L applicazione Java Diagrammi ER. 3.1 La finestra iniziale, il menu e la barra pulsanti

Guida all uso di Java Diagrammi ER

Strutture. Strutture e Unioni. Definizione di strutture (2) Definizione di strutture (1)

TRUCCHI PER GIMP - Elemento a colori in foto bianco e nero

Vlan Relazione di Sistemi e Reti Cenni teorici

ARCHIVING PapER. Con BvLArchivio avete la possibilità di archiviare documenti cartacei in modo manuale o automatizzato.

Introduzione alla programmazione in C

Office 2007 Lezione 09. Contenuto riutilizzabile

Tutorial: Stratificazioni dei muri in Revit Architecture

LEZIONE 6. Sommario LEZIONE 6 CORSO DI COMPUTER PER SOCI CURIOSI

Introduzione a Dev-C++

ASSOCIAZIONE ANFFAS ONLUS UDINE. presenta LA NOSTRA VISION. Questo documento è in versione facile da leggere

Guida all uso delle Web View su ios

Guida all utilizzo del compilatore lcc-win32 per creare una applicazione console

MANUALE PARCELLA FACILE PLUS INDICE

UN TOPO SFUGGENTE. CoderDOJO su Javascript - Trento. Augusto Ciuffoletti. 26 maggio 2015

TUTORIAL REGISTRO ELETTRONICO NUVOLA

DOCUMENTO ESPLICATIVO

STAMPA UNIONE DI WORD

La struttura dati ad albero binario

Laboratorio di Algoritmi e Strutture Dati

Compito di Fondamenti di Informatica

COMUNICAZIONE UTENTI SISTEMI-PROFIS INSTALLAZIONE GE.RI.CO e PARAMETRI2015

I puntatori e l allocazione dinamica di memoria

Uso di JUnit. Fondamenti di informatica Oggetti e Java. JUnit. Luca Cabibbo. ottobre 2012

File, Modifica, Visualizza, Strumenti, Messaggio

Gli SmartArt. Office 2007 Lezione 05

void funzioneprova() { int x=2; cout<<"dentro la funzione x="<<x<<endl; }

COME ELIMINARE PARTI DEL TEMPLATE IN PAGINE SINGOLE

LABORATORIO DI PROGRAMMAZIONE 1 CORSO DI LAUREA IN MATEMATICA UNIVERSITÀ DEGLI STUDI DI MILANO V Indice

Realizzazione di una classe con un associazione

Versione 7.0 Taglie e Colori. Negozio Facile

GUIDA ALLA PROGRAMMAZIONE GRAFICA IN C

Al telefono: Come ottenere informazioni.senza chiederle!

Procedura per creare un archivio storico locale nelle 24 ore giornaliere

SIMULAZIONE CIRCUITI LOGICI CON LOGISIM

DOCUMENTO ESPLICATIVO

<?php include './include/page.php';

Indirizzo di una funzione. Puntatori a funzioni. Definizione di variabili. Definizione di variabili

Definizione di nuovi tipi in C

Università di Torino Facoltà di Scienze MFN Corso di Studi in Informatica. Programmazione I - corso B a.a prof.

Equilibrio bayesiano perfetto. Giochi di segnalazione

ISTRUZIONI XCODE. Autore: Luca Florio (luca.florio<at>polimi.it)

Esercizio: gestione di un conto corrente

Programmazione C Massimo Callisto De Donato massimo.callisto@unicam.it

Le funzioni in C. I programmi C sono costituiti da definizioni di variabili e funzioni.

Librerie. Laboratorio di Informatica Antonio Monteleone 28

Definire all'interno del codice un vettore di interi di dimensione DIM, es. int array[] = {1, 5, 2, 4, 8, 1, 1, 9, 11, 4, 12};

Joomla: Come installarlo e come usarlo. A cura di

GUIDA AI COLLEGAMENTI COME VEDERE IL DIGITALE TERRESTRE

Corso di Laurea in Ingegneria Gestionale Esame di Informatica a.a settembre 2011


Come e quanto si guadagna con Human Support International?

Fondamenti di Informatica 2

LISTE, INSIEMI, ALBERI E RICORSIONE

COME UTILIZZARE ARCHIVE-HOST

Centro Iniziative Sociali Municipio III

Convertitori numerici in Excel

Teoria delle code. Sistemi stazionari: M/M/1 M/M/1/K M/M/S

strutturare dati e codice

Introduzione a ROOT. 1. Informazioni generali

2 Fortino Lugi. Figura Errore. Nel documento non esiste testo dello stile specificato Finestra attiva o nuovo documento

Olga Scotti. Basi di Informatica. File e cartelle

ATOLLO BACKUP GUIDA INSTALLAZIONE E CONFIGURAZIONE

AVVIO ANNO. Dalla base dati EDT alla base dati PRONOTE. L essenziale da sapere per affrontare un nuovo. Preparare i dati per PRONOTE

Alla scoperta della nuova interfaccia di Office 2010

Programmazione I - Laboratorio

MOCA. Modulo Candidatura. [Manuale versione 1.0 marzo 2013]

MODULO 5 ACCESS Basi di dati. Lezione 4

IL METODO PER IMPOSTARE E RISOLVERE I PROBLEMI DI FISICA (NB non ha nulla a che vedere con il metodo scientifico)

Modulo didattico sulla misura di grandezze fisiche: la lunghezza

Introduzione al Linguaggio C

2.0 Gli archivi. 2.1 Inserire gli archivi. 2.2 Archivio Clienti, Fornitori, Materiali, Noleggi ed Altri Costi. Impresa Edile Guida all uso

Acquistabile nella versione speciale Freud in aggiunta al contratto di cascading Freud o direttamente dal sito

App-V Dynamic Suite Composition

Per effettuare la stampa di una cartella di lavoro si accede al comando. Stampa dal menu File o si utilizza il pulsante omonimo sulla barra

NUOVA PROCEDURA COPIA ED INCOLLA PER L INSERIMENTO DELLE CLASSIFICHE NEL SISTEMA INFORMATICO KSPORT.

Transcript:

CREARE UNA LIBRERIA IN C Prima di cominciare a vedere come fare una libreria, dobbiamo capire di cosa abbiamo bisogno... di un file.h che sarà l'header della libreria (ovvero il file che conterrà i prototipi delle funzioni della libreria e la definizione dei tipi che l'utente che utilizzerà la libreria potrà usare). di un file.c che sarà il body della libreria (ovvero conterrà il corpo delle funzioni e la definizione dei tipi base usati dalla funzioni). Detto questo, passiamo ad alcune considerazioni prima di vedere la creazione di una vera e propria libreria... avendo un file.h in cui si definiscono i tipi e i prototipi, possiamo usare ciò per definire un tipo particolare che a variazione della sua definizione può essere int, char, string o qualsiasi altra cosa... vediamo come. Per prima cosa, creiamo il nostro file.h: //item.h typedef struct item* Item; int equals(item x, Item y); int compareto(item x, Item y); Item readitem(); void printitem(item i); Questo file chiamato item.h come vedete contiene alcuni metodi per la lettura dei suoi dati, la stampa di essi e il loro confronto. Il tipo Item è definito attraverso un typedef di un puntatore di una struttura chiamata struct item. Ma cosa sarà lo struct item per noi? Grazie proprio a questa non conoscenza possiamo produrre più body per il file.h, così da avere più definizioni per il tipo di struct item, ma una sola per l'header, e quindi tutti coloro che vorranno usare l'oggetto Item non dovranno riscrivere più volte il loro codice cliente (ovvero il programma che userà la libreria), ma semplicemente decidere quale definizione di Item usare durante la compilazione. Giusto per fare vedere due esempi, ecco qui due body per la libreria item: Item-string.c #include <stdio.h> #include <string.h> struct item char* value; ; int equals(item x, Item y) return (strcmp(x >value, y Item-int.c #include <stdio.h> struct item int value; ; int equals(item x, Item y) int a,b;

>value)==0); a=x >value; b=y >value; return a==b; int compareto(item x, Item y) return strcmp(x >value, y >value); int compareto(item x, Item y) int a,b; a=x >value; b=y >value; if(a>b) return 1; else if(a==b) return 0; else return 1; Item readitem() Item i = malloc(sizeof(struct item)); char string[512]; char* ns; printf("insert value to read: "); gets(string); Item readitem() Item i = malloc(sizeof(struct item)); int n; printf("insert value to read: "); scanf("%d", &n); i >value=n; ns=calloc(strlen(string),sizeof( char)); strcpy(ns, string); i >value=ns; return i; return i; void printitem(item i) printf("value of item: %s \n", i >value); void printitem(item i) printf("value of item: %d \n", i >value); Come potete vedere dal corpo di queste due funzioni, entrambe hanno nel loro codice ciò: #include item.h Cosa significa ciò? Significa durante la compilazione, portati dentro le definizioni di tipi e funzioni dentro il file item.h. L'uso dei doppi apici si riferisce che il file item.h si trova nella stessa directory del vostro file.

Ora che abbiamo sia i body che l'header possiamo creare la nostra libreria... ma come? Con il comando ar. Assicurandovi che il item.h e i due item-*.c siano nella stessa directory date i seguenti comandi da terminale: $ gcc c item int.c $ ar ruv item int.a item int.o $ gcc c item string.c $ ar ruv item string.a item string.o Ora dovreste avere nella vostra directory 2 archivi chiamati item-int.a e item-string.a. Questi due archivi sono puro file binario che potrete distribuire insieme ai vostri file.h come librerie c compatibili col sistema architetturale in cui sono state compilate (x86-32bit, x86-64bit, PowerPC, ARM, etc..). Ora vi chiederete.. e dunque? Qual'è l'utilità di ciò? Per ora non si vede, ma andiamo avanti... vediamo ora di voler creare ora una libreria che gestisce uno stack di Item. Perché di Item e non di int? Perché quando l'utente che userà la libreria dello stack potrà autonomamente scegliere se usare la libreria che legge interi o stringhe, il tutto modificando solo il codice del proprio programma! (In questo modo le nostre librerie saranno autonome dal resto del programma, e quindi ri-utilizzabili in molteplici contesti). Bado alle ciance, e vediamo per prima cosa il nostro file.h //astrostack.h typedef struct stack* AstroStack; AstroStack initstack(); int stackempty(astrostack s); void push(astrostack s, Item elem); Item pop(astrostack s); Item top(astrostack s); int size(astrostack s); In maniera identica come prima, definiamo i tipi e i prototipi delle funzioni che vogliamo che l'utente a cui distribuiamo tutto ciò possa utilizzare nel proprio programma. Passiamo alla definizione del body... //astrostack.c #include "astrostack.h" typedef struct node Item info; struct node* next; Node; typedef Node* List; struct stack

; List contents; int size; AstroStack initstack() AstroStack s; s = malloc(sizeof(struct stack)); s >contents = NULL; s >size=0; return s; int stackempty(astrostack s) return s >contents == NULL; void push(astrostack s, Item elem) List l = malloc(sizeof(node)); l >info = elem; l >next = s > contents; s >contents = l; s >size=(s >size)+1; Item pop(astrostack s) List old = s >contents; Item elem = old >info; s >contents = old >next; s >size=(s >size) 1; free(old); return elem; Item top(astrostack s) Item elem = (s >contents) >info; return elem; int size(astrostack s) return s >size; Come potete vedere, la definizione del nostro stack non vincolata in alcun modo al tipo di configurazione di Item, ma solo al suo header...

Quindi, come già fatto prima, diamo i comandi per creare l'archivio... $ gcc c astrostack.c $ ar ruv astrostack.a astrostack.o Ora abbiamo due librerie... una per gli Item e una per lo stack... creiamoci un file test.c per fare alcuni test su di esse.. //test.c #include <stdio.h> #include "astrostack.h" int main(int argc, char **argv) Item i3 = readitem(); Item i5 = readitem(); Item i7 = readitem(); Item p4; AstroStack s = initstack(); printf("inizializzazione stack...ok\npush del 3 valore inserito...\n"); push(s,i7); printf("push del 2 valore inserito...\n"); push(s,i5); printf("push del 1 valore inserito...\n"); push(s,i3); int lung = size(s); printf("lunghezza dello stack dopo 3 push... %d \n", lung); printf("pop del valore in testa...\n"); p4 = pop(s); printitem(p4); printf("pop del valore in testa...\n"); p4 = pop(s); printitem(p4); printf("pop del valore in testa...\n"); p4 = pop(s); printitem(p4); lung =size(s); printf("lunghezza dello stack dopo 3 pop... %d \n", lung); return 0; Come potete vedere, anche il nostro test.c è completamente svincolato dal tipo di configurazione di Item. Per compilare il nostro programma ci basta dare il seguente comando: $ gcc test.c o test item int.a astrostack.a

Ed ecco qui il risultato.. $./test Insert value to read: 1 Insert value to read: 2 Insert value to read: 3 Inizializzazione stack...ok Push del 3 valore inserito... Push del 2 valore inserito... Push del 1 valore inserito... Lunghezza dello stack dopo 3 push... 3 Pop del valore in testa... Value of item: 1 Pop del valore in testa... Value of item: 2 Pop del valore in testa... Value of item: 3 Lunghezza dello stack dopo 3 pop... 0 $ Provate a cambiare item-int.a con item-string.a, e vedrete che il programma continuerà a funzionare perfettamente. Riassumendo... per creare una libreria avete bisogno di: il file.h con la dichiarazione dei tipi e dei prototipi delle funzioni il file.c con il corpo delle funzioni e dei tipi utilizzati dalle funzioni (con l'include del file.h) Dunque, create un archivio.a contenente Il file.o del body della libreria. Fatto questo potete distribuire la vostra libreria, ovvero distribuendo il file.h con il suo file.a. È possibile mettere più file.o dentro l'archivio, ovviamente ricordatevi di distribuire tutti i vari file.h necessari. Nel programma basterà includere la libreria.h. Se la libreria non si trova nella stessa path del vostro file, vi ricordo che potete specificarla voi. Per esempio: #include headers/header.h Potete creare un unico eseguibile anche usando direttamente i file.o, per esempio con i file.o generati precedentemente possiamo fare: $ gcc o eseguibile test.o item int.o astrostack.o Questo è tutto! Buona programmazione C! Autore: Borsato Claudio