1 of 16

Creazione di librerie�inclusione di file esterni

3^ INFORMATICO - IIS PASCAL�DIPARTIMENTO INFORMATICA

2 of 16

2

ARGOMENTI

  • Concetto di libreria
  • Definizione di file di libreria
  • Inclusione di file esterni (header e source)
  • Librerie template

3 of 16

3

DEFINIZIONE

Per “libreria” si intende

un insieme di funzioni o strutture dati predefinite e predisposte per essere riutilizzate da altri programmi software attraverso un'opportuna procedura di collegamento.

Il termine libreria nasce da una fallace trasposizione lessicale dell'inglese library (lett. "biblioteca"), ma ormai è così diffuso nel vocabolario dei professionisti da essere accettato quale possibile traduzione.”[Wikipedia]

l’idea è di creare delle funzioni una sola volta e usarle ovunque sia necessario senza reinventare la ruota tutte le volta

4 of 16

Creare una libreria personalizzata

5 of 16

Creare una libreria personalizzata

Fin dal primo esempio di codice incontrato, abbiamo visto istruzioni�del tipo� #include <iostream>

utilizzata, ad esempio, per poter usare cin e cout

Ma perché?

Perché in C++ esistono appunto due file iostream.h e iostream.cpp �(della libreria standard libstdc++) già pronti che qualcuno (per fortuna) ha già implementato e che possiamo usare senza doverli reinventare

A destra un estratto del codice del file iostream.h�ref: https://gcc.gnu.org/onlinedocs/gcc-4.6.2/libstdc++/api/a00911_source.html

6 of 16

Creare una libreria personalizzata

E’ possibile creare librerie con i propri codici per evitare di doverli riscrivere (o copiarli) ogni volta.

Vediamo un esempio:

immaginiamo di aver scritto la funzione di ordinamento per gestire l’ordinamento di un array di interi…

7 of 16

Creare una libreria personalizzata

Proprio perché è generica, sarebbe bello poterla usare in vari programmi senza doverla copiare e/o riscrivere

Possiamo quindi usare la possibilità di includere files esterni in una applicazione

Buona norma è utilizzare due file diversi:

  • uno per la dichiarazione di tipi e funzioni
  • uno per l’implementazione del corpo delle funzioni

in CodeBlocks procedo in questo modo:�Menu: File -> New -> File

e selezioniamo� C/C++ header

8 of 16

Creare una libreria personalizzata

Scegliamo il nome che vogliamo dare alla nostra libreria (ad esempio mytools.h)

e selezioniamo il path in cui salvarla

�per adesso possiamo scegliere di salvarla insieme al progetto

NOTA:

Codeblocks suggerisce il nome da dare alla header_guard ovvero una #define che impedisce di includere lo stesso file di libreria più volte all’interno dello stesso progetto

possiamo lasciare il nome suggerito (che è quello standard)

9 of 16

Creare una libreria personalizzata

Otteniamo quanto in figura:

Codeblocks crea una directory “Headers” con dentro il nostro file mytools.h�e crea il contenuto del file con solo la header_guard

All’interno del file mytools.h inseriremo le dichiarazioni delle funzioni di libreria che vogliamo implementare ed eventualmente tipi dato astratti

10 of 16

Creare una libreria personalizzata

Aggiungiamo quindi la dichiarazione della funzione ordina senza aggiungere il corpo dell’implementazione

11 of 16

Creare una libreria personalizzata

Andiamo quindi ad includere mytools.h nel main per poter usare la funzione lì definita.�Appena una sintassi diversa perché usiamo i doppi apici invece dei brackets (riservati alle librerie standard del linguaggio memorizzate nelle directory apposite)

Provando a compilare ottengo un errore perché non trovo l’implementazione

||=== Build: Debug in 10_uso_di_librerie (compiler: GNU GCC Compiler) ===|

/usr/bin/ld: obj/Debug/main.o||in function `main':|

...main.cpp|7|undefined reference to `void ordina<int>(int*, int)'|

||error: ld returned 1 exit status|

||=== Build failed: 2 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|

12 of 16

Creare una libreria personalizzata

Procedo adesso a creare il file .cpp per l’implementazione della funzione�Menu: File -> New -> File

selezioniamo C/C++ source e salviamo con lo stesso nome dell’header ma con estensione .cpp�Il file viene inserito nella directory “Sources” ed è vuoto

13 of 16

Creare una libreria personalizzata

Aggiungiamo quindi il corpo della funzione ordina in mytools.cpp

Nota che non c’è bisogno di includere mytools.h perché è già inclusa dal main…

La compilazione adesso restituisce un messaggio positivo….

-------------- Build: Debug in 10_uso_di_librerie (compiler: GNU GCC Compiler)---------------

g++ -Wall -fexceptions -g -c mytools.cpp -o obj/Debug/mytools.o

g++ -o bin/Debug/10_uso_di_librerie obj/Debug/main.o obj/Debug/mytools.o

Output file is bin/Debug/10_uso_di_librerie with size 36.68 KB

Process terminated with status 0 (0 minute(s), 0 second(s))

0 error(s), 0 warning(s) (0 minute(s), 0 second(s))

14 of 16

Creare una libreria personalizzata

Posso ora lavorare nel main tranquillamente….

La compilazione adesso restituisce un messaggio positivo….

-------------- Build: Debug in 10_uso_di_librerie (compiler: GNU GCC Compiler)---------------

g++ -Wall -fexceptions -g -c mytools.cpp -o obj/Debug/mytools.o

g++ -o bin/Debug/10_uso_di_librerie obj/Debug/main.o obj/Debug/mytools.o

Output file is bin/Debug/10_uso_di_librerie with size 36.68 KB

Process terminated with status 0 (0 minute(s), 0 second(s))

0 error(s), 0 warning(s) (0 minute(s), 0 second(s))

15 of 16

Creare una libreria personalizzata : templates

NOTA: Nel caso di librerie contenenti funzioni templates, queste devono essere dichiarate e implementate nel file.h (spesso chiamato .hpp in questi casi) per evitare problemi di linking

16 of 16

Esercizi

  1. Crea una libreria matrici_intere per gestire:
    1. valorizzazione casuale di matrici NxN con N<=1000 (gestione logica delle dimensioni)
    2. stampa dei valori in forma tabellare
    3. ricerca del massimo nella matrice
    4. ricerca del minimo nella matrice
    5. conteggio delle occorrenze di un numero nella matrice
    6. media per riga
    7. massimo per colonna

Le librerie sono ancora più utili se contengono funzioni e strutture template (come la STL)

  • Crea una libreria template array_functions per gestire
    • ordinamento di un array generico
    • ricerca di un elemento in un array generico
    • conteggio di un elemento in un array generico
    • controllo se un array è ordinato o no