20
Programmazione modulare nel linguaggio C Fulvio CORNO - Matteo SONZA REORDA Dip. Automatica e Informatica Politecnico di Torino

Programmazione modulare nel linguaggio C Fulvio CORNO - Matteo SONZA REORDA Dip. Automatica e Informatica Politecnico di Torino

Embed Size (px)

Citation preview

Page 1: Programmazione modulare nel linguaggio C Fulvio CORNO - Matteo SONZA REORDA Dip. Automatica e Informatica Politecnico di Torino

Programmazione modulare nel linguaggio

C

Fulvio CORNO - Matteo SONZA REORDADip. Automatica e Informatica

Politecnico di Torino

Page 2: Programmazione modulare nel linguaggio C Fulvio CORNO - Matteo SONZA REORDA Dip. Automatica e Informatica Politecnico di Torino

A.A. 2002/2003 APA-extern 2

Introduzione Non è possibile creare programmi di

elevata complessità lavorando con un unico file sorgente

Lentezza di ricompilazione Difficile riuso di procedure Impossibile collaborare tra più

programmatori Difficile tener traccia delle modifiche

Occorre realizzare programmi distribuiti su più file sorgenti.

Page 3: Programmazione modulare nel linguaggio C Fulvio CORNO - Matteo SONZA REORDA Dip. Automatica e Informatica Politecnico di Torino

A.A. 2002/2003 APA-extern 3

Compilazione e Link

Sorgente C

Libreria

CompilatoreCompilatoreCompilatore

Sorgente C

Sorgente C

Codice oggetto

Codice oggetto

Codice oggetto

LinkerLibreria

Codice eseguibil

e

.c

.obj

.lib

.exe

Assemblatore

Sorgente Assembl

er

Codice oggetto

Page 4: Programmazione modulare nel linguaggio C Fulvio CORNO - Matteo SONZA REORDA Dip. Automatica e Informatica Politecnico di Torino

A.A. 2002/2003 APA-extern 4

Struttura del compilatore

Sorgente C

Ottimizzazione

Generazione codice binario

Ottimizzazione

Generazione codice

indipendente HW

Analisi semantica

Analisi sintattica

Analisi lessicale

Codice oggetto

Page 5: Programmazione modulare nel linguaggio C Fulvio CORNO - Matteo SONZA REORDA Dip. Automatica e Informatica Politecnico di Torino

A.A. 2002/2003 APA-extern 5

Modulo di Codice oggetto

Contiene il codice binario corrispondente ad un modulo C

Contiene dei riferimenti esterni a funzioni e variabili dichiarate in altri moduli

Contiene funzioni e variabili utilizzabili da altri moduli

Uno ed un solo modulo contiene main().

Page 6: Programmazione modulare nel linguaggio C Fulvio CORNO - Matteo SONZA REORDA Dip. Automatica e Informatica Politecnico di Torino

A.A. 2002/2003 APA-extern 6

Modulo oggetto

sort.obj

sort.c

strcmpstrcpy

stdout

inssortcntsort

scambi

Funzioni usate dal modulo ma

definite altrove

Variabili usate dal modulo ma

definite altrove

Funzioni definite nel modulo, richiamabili anche dall’esterno

Variabili definite nel modulo, utilizzabili anche dall’esterno

Codice binario

Page 7: Programmazione modulare nel linguaggio C Fulvio CORNO - Matteo SONZA REORDA Dip. Automatica e Informatica Politecnico di Torino

A.A. 2002/2003 APA-extern 7

Linker

Codice oggetto

Codice oggetto

Codice oggetto

Codice oggetto

Codice oggetto

Codice eseguibileCodice binario

Page 8: Programmazione modulare nel linguaggio C Fulvio CORNO - Matteo SONZA REORDA Dip. Automatica e Informatica Politecnico di Torino

A.A. 2002/2003 APA-extern 8

Modularità

Ciascun modulo in C: Definisce alcune funzioni “private” Definisce alcune funzioni “pubbliche” Definisce alcune variabili “private” Definisce alcune variabili “pubbliche” Chiama alcune funzioni “esterne” Usa alcune variabili “esterne”.

Page 9: Programmazione modulare nel linguaggio C Fulvio CORNO - Matteo SONZA REORDA Dip. Automatica e Informatica Politecnico di Torino

A.A. 2002/2003 APA-extern 9

Chiamata di funzioni (I)

extern void InsertionSort(int A[], int n) ;/* … */main(){ int v[10] ;

/* … */InsertionSort(v, 10) ;/* … */

void InsertionSort(int A[], int n) ;

void InsertionSort(int A[], int n){

int i, j, key ;/* … */

Page 10: Programmazione modulare nel linguaggio C Fulvio CORNO - Matteo SONZA REORDA Dip. Automatica e Informatica Politecnico di Torino

A.A. 2002/2003 APA-extern 10

Chiamata di funzioni (II)

Il modulo che esporta una funzione non deve fare nulla di particolare: in C, tutte le funzioni sono pubbliche (per default)

Il modulo che utilizza la funzione deve dichiararne il prototipo (con la parola chiave extern)

Il linker farà il collegamento.

Page 11: Programmazione modulare nel linguaggio C Fulvio CORNO - Matteo SONZA REORDA Dip. Automatica e Informatica Politecnico di Torino

A.A. 2002/2003 APA-extern 11

Funzioni private

Nel caso in cui un modulo definisca delle funzioni che NON vuole esportare, nella definizione (non nel prototipo) deve comparire la parola chiave static.

void InsertionSort(int A[], int n) ;void CancellaVettore(int A[], int n) ;

void InsertionSort(int A[], int n){ . . . }static void CancellaVettore(int A[], int n) { . . . }

Page 12: Programmazione modulare nel linguaggio C Fulvio CORNO - Matteo SONZA REORDA Dip. Automatica e Informatica Politecnico di Torino

A.A. 2002/2003 APA-extern 12

Variabili globali (I)

extern int n_elem ; extern double vett[MAX] ;/* … */{ for(i=0; i<n_elem; ++i)

vett[i]++ ;

int n_elem ;double vett[MAX] ;

static int temp ;

Page 13: Programmazione modulare nel linguaggio C Fulvio CORNO - Matteo SONZA REORDA Dip. Automatica e Informatica Politecnico di Torino

A.A. 2002/2003 APA-extern 13

Variabili globali (II) Il modulo che esporta una variabile

globale non deve fare nulla di particolare: in C, tutte le variabili globali sono pubbliche (per default)

Il modulo che utilizza la variabile deve ri-definirla con la parola chiave extern

Se non si vuole esportare una variabile occorre definirla con la parola chiave static

Le variabili locali (alle procedure) non possono essere condivise.

Page 14: Programmazione modulare nel linguaggio C Fulvio CORNO - Matteo SONZA REORDA Dip. Automatica e Informatica Politecnico di Torino

A.A. 2002/2003 APA-extern 14

Riassunto: funzioniint f( int x ) ;

int f(int x){ . . . }

int f( int x ) ;

{ . . . y = f ( z ) ;. . .}

int f( int x ) ;

static int f(int x){ . . . }

Page 15: Programmazione modulare nel linguaggio C Fulvio CORNO - Matteo SONZA REORDA Dip. Automatica e Informatica Politecnico di Torino

A.A. 2002/2003 APA-extern 15

Riassunto: variabiliint x ;

{ . . . x = 18 ;. . .}

extern int x ;

{ . . . x = x - 38 ;. . .}

static int x ;

{ . . . x = 18 ;. . .}

Page 16: Programmazione modulare nel linguaggio C Fulvio CORNO - Matteo SONZA REORDA Dip. Automatica e Informatica Politecnico di Torino

A.A. 2002/2003 APA-extern 16

Problemi

Le due dichiarazioni (nel modulo che esporta e nei moduli che usano la funzione/variabile) devono coincidere al 100%

int f( int x ) ;

int f(int x){ . . . }

int f( double x ) ;

{ . . . y = f ( z ) ;. . .}Errore!

Page 17: Programmazione modulare nel linguaggio C Fulvio CORNO - Matteo SONZA REORDA Dip. Automatica e Informatica Politecnico di Torino

A.A. 2002/2003 APA-extern 17

Il ruolo degli header file

Si possono utilizzare degli header file (file .h) per raccogliere le definizioni “extern” di funzioni e variabili pubbliche

Il creatore del modulo che esporta le funzioni o variabili crea un file .h

Tutti i moduli che usano tali risorse esportate includono i file .h (#include).

Page 18: Programmazione modulare nel linguaggio C Fulvio CORNO - Matteo SONZA REORDA Dip. Automatica e Informatica Politecnico di Torino

A.A. 2002/2003 APA-extern 18

Esempio di header file (I)

#include "sort.h" /* per controllo coerenza */int n_elem ;double vett[MAX] ;static int temp ;void InsertionSort(int A[], int n){ . . . }static void CancellaVettore(int A[], int n) ;{ . . . }

void InsertionSort(int A[], int n) ;extern int n_elem ; extern double vett[MAX] ;

sort.h

sort.c

Page 19: Programmazione modulare nel linguaggio C Fulvio CORNO - Matteo SONZA REORDA Dip. Automatica e Informatica Politecnico di Torino

A.A. 2002/2003 APA-extern 19

Esempio di header file (II)

#include "sort.h" /* per importare dichiarazioni */main(){ int v[10] ;

/* … */InsertionSort(v, 10) ;/* … */for(i=0; i<n_elem; ++i)

vett[i]++ ;

void InsertionSort(int A[], int n) ;extern int n_elem ; extern double vett[MAX] ;

sort.h

altro.c

Page 20: Programmazione modulare nel linguaggio C Fulvio CORNO - Matteo SONZA REORDA Dip. Automatica e Informatica Politecnico di Torino

A.A. 2002/2003 APA-extern 20

Note Ciascun modulo solitamente esporta

alcune funzioni o variabili, e ne importa altre

È sempre bene che ciascun modulo includa anche il proprio header file

Conviene limitare al minimo il numero di variabili condivise

Includere anche le #define nei file .h Gruppi di moduli correlati tra loro

possono condividere un solo file .h.