TIPI DI DATO Un tipo di dato T è definito come: un dominio di valori, D un insieme di funzioni F...

47
TIPI DI DATO Un tipo di dato T è definito come: un dominio di valori, D un insieme di funzioni F 1 ,..,F n sul dominio D un insieme di predicati P 1 ,..,P m sul dominio D T = { D, {F 1 ,...,F n }, {P 1 ,...,P m } }

Transcript of TIPI DI DATO Un tipo di dato T è definito come: un dominio di valori, D un insieme di funzioni F...

Page 1: TIPI DI DATO Un tipo di dato T è definito come: un dominio di valori, D un insieme di funzioni F 1,..,F n sul dominio D un insieme di predicati P 1,..,P.

TIPI DI DATO

Un tipo di dato T è definito come:

un dominio di valori, D

un insieme di funzioni F1,..,Fn sul dominio D

un insieme di predicati P1,..,Pm sul dominio D

T = { D, {F1,...,Fn}, {P1,...,Pm} }

Page 2: TIPI DI DATO Un tipo di dato T è definito come: un dominio di valori, D un insieme di funzioni F 1,..,F n sul dominio D un insieme di predicati P 1,..,P.

COMPATIBILITÀ DI TIPO

Consiste nella possibilità di usare, entro certi limiti, oggetti di un tipo al posto di oggetti di un altro tipo.

Un tipo T1 è compatibile con un tipo T2 se

il dominio D1 di T1 è contenuto nel dominio D2 di T2.

– int è compatibile con float perché Z R

– ma float non è compatibile con int

Page 3: TIPI DI DATO Un tipo di dato T è definito come: un dominio di valori, D un insieme di funzioni F 1,..,F n sul dominio D un insieme di predicati P 1,..,P.

COMPATIBILITÀ DI TIPO

Se T1 è un tipo compatibile con T2, un operatore definito per T2 può essere utilizzato anche con parametri di tipo T1

In particolare se Op è definito per T2 come:Op: D2 D2 D2

allora può essere utilizzato anche per T1, come:Op: D1 D2 D2Op: D2 D1 D2

Gli operandi di tipo T1 sono convertiti automatica-mente nel tipo T2 - il risultato è sempre di tipo T2.

Page 4: TIPI DI DATO Un tipo di dato T è definito come: un dominio di valori, D un insieme di funzioni F 1,..,F n sul dominio D un insieme di predicati P 1,..,P.

COMPATIBILITÀ DI TIPO

Se T1 è un tipo compatibile con T2, un operatore definito per T2 può essere anche utilizzato con parametri di tipo T1

In particolare se Op è definito per T2 come:Op: D2 D2 D2

allora può essere utilizzato anche per T1, come:Op: D1 D2 D2Op: D2 D1 D2

Gli operandi di tipo T1 sono convertiti automatica-mente nel tipo T2 - il risultato è sempre di tipo T2.

3 / 4.2 è una divisione fra reali, in cui il primo operando è convertito automaticamente da int a double

3 % 4.2 è una operazione non ammissibile, perché 4.2 non può essere convertito in int

Page 5: TIPI DI DATO Un tipo di dato T è definito come: un dominio di valori, D un insieme di funzioni F 1,..,F n sul dominio D un insieme di predicati P 1,..,P.

CONVERSIONI IMPLICITE

1) Ogni variabile di tipo char o short (eventualmente con qualifica signed o unsigned) viene convertita in int

2) Se dopo il passo 1 l'espressione è ancora eterogenea, si converte temporaneamente l'operando di tipo inferiore al tipo superiore:

char int long int float double long double

3) A questo punto l'espressione è omogenea e viene invocata l'operazione opportuna. Il risultato è dello stesso tipo.

Page 6: TIPI DI DATO Un tipo di dato T è definito come: un dominio di valori, D un insieme di funzioni F 1,..,F n sul dominio D un insieme di predicati P 1,..,P.

CONVERSIONI IMPLICITE

Esempio

int x;char y;double r;

L’espressione:(x+y) / r

produce un risultato di tipo double.

Page 7: TIPI DI DATO Un tipo di dato T è definito come: un dominio di valori, D un insieme di funzioni F 1,..,F n sul dominio D un insieme di predicati P 1,..,P.

COMPATIBILITÀ IN ASSEGNAMENTO

• In un assegnamento, l’identificatore di variabile e l’espressione devono essere dello stesso tipo

• Se così non è, scatta una conversione implicita

Esempioint x=5; char y='a'; double r=3.1415;

x = y; /* conversione da char ad int */x = y+x;r = y; /* char --> int --> double */

Page 8: TIPI DI DATO Un tipo di dato T è definito come: un dominio di valori, D un insieme di funzioni F 1,..,F n sul dominio D un insieme di predicati P 1,..,P.

COMPATIBILITÀ IN ASSEGNAMENTO• In generale, sono automatiche le conversioni di

tipo che non provocano perdita d’informazione• Espressioni che possono provocare perdita di

informazioni non sono però illegali

Esempioint x=5; float f=2.71F;; double d=3.1415;

f = f+i; /* int convertito in float */i = d/f; /* double convertito in int !*/

f = d; /* arrotondamento o troncamento */Possibile Warning: conversion may lose significant

digits

Page 9: TIPI DI DATO Un tipo di dato T è definito come: un dominio di valori, D un insieme di funzioni F 1,..,F n sul dominio D un insieme di predicati P 1,..,P.

CAST

• In qualunque espressione è possibile forzare una particolare conversione utilizzando l'operatore di cast

( <tipo> ) <espressione>

Esempi

int i=5; long double x=7.77; double y=7.1;

i = (int) sqrt(384);

x = (long double) y*y;

i = (int) x % (int)y;

Page 10: TIPI DI DATO Un tipo di dato T è definito come: un dominio di valori, D un insieme di funzioni F 1,..,F n sul dominio D un insieme di predicati P 1,..,P.

TIPI DI DATO

I tipo di dato, scalari o strutturati, si differen-ziano in predefiniti e definiti dall’utente.

tipi di dato

predefiniti definiti

dall'utente

costruttoripredefiniti

definitidall'utenteint

charfloatdouble

enum []structunion

puntatoriscalari strutturati

Page 11: TIPI DI DATO Un tipo di dato T è definito come: un dominio di valori, D un insieme di funzioni F 1,..,F n sul dominio D un insieme di predicati P 1,..,P.

TIPI DI DATO

Ogni elaboratore è intrinsecamente capace di trattare domini di dati di tipi primitivi

– numeri naturali, interi, reali – caratteri e stringhe di caratteri

e quasi sempre anche collezioni di oggetti, mediante la definizione di tipi strutturati

– array, strutture

Altri tipi possono essere definiti dall’utente.

Page 12: TIPI DI DATO Un tipo di dato T è definito come: un dominio di valori, D un insieme di funzioni F 1,..,F n sul dominio D un insieme di predicati P 1,..,P.

TIPI DEFINITI DALL’UTENTE

• In C, l’utente può introdurre nuovi tipi tramite una definizione di tipo

• La definizione associa a un identificatore (nome del tipo) un tipo di dato

– aumenta la leggibilità del programma– consente di ragionare per astrazioni

• Il C consente, in particolare, di:– ridefinire tipi già esistenti– definire dei nuovi tipi enumerativi– definire dei nuovi tipi strutturati

Page 13: TIPI DI DATO Un tipo di dato T è definito come: un dominio di valori, D un insieme di funzioni F 1,..,F n sul dominio D un insieme di predicati P 1,..,P.

TIPI RIDEFINITI

• Un nuovo identificatore di tipo viene dichiarato identico a un tipo già esistente

• Schema generale:

typedef TipoEsistente NuovoTipo ;

• Esempio

typedef int MioIntero;

MioIntero X,Y,Z;

int W;

Page 14: TIPI DI DATO Un tipo di dato T è definito come: un dominio di valori, D un insieme di funzioni F 1,..,F n sul dominio D un insieme di predicati P 1,..,P.

TIPI ENUMERATIVI

• Un tipo enumerativo viene specificato tramite l’elenco dei valori che i dati di quel tipo possono assumere.

• Schema generale:

typedef enum {a1, a2, a3, ... , aN } EnumType;

• Il compilatore associa a ciascun “identifica-tivo di valore” a1,..aN un numero naturale (0,1,...), che viene usato nella valutazione di espressioni che coinvolgono il nuovo tipo.

Page 15: TIPI DI DATO Un tipo di dato T è definito come: un dominio di valori, D un insieme di funzioni F 1,..,F n sul dominio D un insieme di predicati P 1,..,P.

TIPI ENUMERATIVI

• Gli “identificativi di valore” a1,... , aN sono a tutti gli effetti delle nuove costanti.

• Esempitypedef enum { lu, ma, me, gi, ve, sa, do} Giorni;typedef enum { cuori, picche, quadri, fiori} Carte;

Carte C1, C2, C3, C4, C5;Giorni Giorno;if (Giorno == do) /* giorno festivo */else /* giorno feriale */

Page 16: TIPI DI DATO Un tipo di dato T è definito come: un dominio di valori, D un insieme di funzioni F 1,..,F n sul dominio D un insieme di predicati P 1,..,P.

TIPI ENUMERATIVI - NOTE

• Un “identificativo di valore” può comparire una sola volta nella definizione di un solo tipo, altrimenti si ha ambiguità.

• Esempio

typedef enum { lu, ma, me, gi, ve, sa, do} Giorni;

typedef enum { lu, ma, me} PrimiGiorni;

La definizione del secondo tipo enumerativo è scorretta, perché gli identificatori lu, ma, me sono già stati usati altrove.

Page 17: TIPI DI DATO Un tipo di dato T è definito come: un dominio di valori, D un insieme di funzioni F 1,..,F n sul dominio D un insieme di predicati P 1,..,P.

TIPI ENUMERATIVI - NOTE

• Un tipo enumerativo è totalmente ordinato: vale l’ordine con cui gli identificativi di valo-re sono stati elencati nella definizione.

• Esempio

typedef enum { lu, ma, me, gi, ve, sa, do} Giorni;

Data la definizione sopra,lu < ma è veralu >= sa è falsa

in quanto lu 0, ma 1, me 2, etc.

Page 18: TIPI DI DATO Un tipo di dato T è definito come: un dominio di valori, D un insieme di funzioni F 1,..,F n sul dominio D un insieme di predicati P 1,..,P.

TIPI ENUMERATIVI - NOTE

• Poiché un tipo enumerativo è, per la mac-china C, indistinguibile da un intero, è possibile in linea di principio mischiare interi e tipi enumerativi

• Esempio

typedef enum { lu, ma, me, gi, ve, sa, do} Giorni;

Giorni g;

g = 5; /* equivale a g = sa */

• È una pratica da evitare ovunque possibile!

Page 19: TIPI DI DATO Un tipo di dato T è definito come: un dominio di valori, D un insieme di funzioni F 1,..,F n sul dominio D un insieme di predicati P 1,..,P.

TIPI ENUMERATIVI - NOTE

• Poiché un tipo enumerativo è, per la mac-china C, indistinguibile da un intero, è possibile in linea di principio mischiare interi e tipi enumerativi

• Esempio

typedef enum { lu, ma, me, gi, ve, sa, do} Giorni;

Giorni g;

g = 5; /* equivale a g = sa */

• È una pratica da evitare ovunque possibile!

Non c’è alcun controllo sugli estremi: g = 24 verrebbe accettato... Ma con quali conseguenze??

Page 20: TIPI DI DATO Un tipo di dato T è definito come: un dominio di valori, D un insieme di funzioni F 1,..,F n sul dominio D un insieme di predicati P 1,..,P.

TIPI ENUMERATIVI - NOTE

• È anche possibile specificare i valori natu-rali cui associare i simboli a1,... , aN

• qui, lu 0, ma 1, me 2, etc.:typedef enum { lu, ma, me, gi, ve, sa, do} Giorni;

• qui, invece, lu 1, ma 2, me 3, etc.:typedef enum { lu=1, ma, me, gi, ve, sa, do} Giorni;

• qui, infine, l’associazione è data caso per caso:typedef enum { lu=1, ma, me=7, gi, ve, sa, do} Giorni;

Page 21: TIPI DI DATO Un tipo di dato T è definito come: un dominio di valori, D un insieme di funzioni F 1,..,F n sul dominio D un insieme di predicati P 1,..,P.

IL TIPO BOOLEAN

• Il boolean non esiste in C, ma si può facilmente definirlo:typedef enum { false, true } Boolean;

• così:

false 0, true 1

false < true

• logica positiva

Page 22: TIPI DI DATO Un tipo di dato T è definito come: un dominio di valori, D un insieme di funzioni F 1,..,F n sul dominio D un insieme di predicati P 1,..,P.

UN PROBLEMA

• La possibilità di introdurre nuovi tipi pone il problema di stabilire se e quanto due tipi siano compatibili fra loro.

• Due possibili scelte:

– equivalenza strutturaletipi equivalenti se strutturalmente identici

– equivalenza nominaletipi equivalenti se definiti nella stessa definizione oppure se il nome dell’uno è definito espressa-mente come identico all’altro.

Scelta dal C

Page 23: TIPI DI DATO Un tipo di dato T è definito come: un dominio di valori, D un insieme di funzioni F 1,..,F n sul dominio D un insieme di predicati P 1,..,P.

EQUIVALENZA STRUTTURALE

• Esempio di equivalenza strutturale

typedef int MioIntero;

typedef int NuovoIntero;

MioIntero A;

NuovoIntero B;

• I due tipi MioIntero e NuovoIntero sono equivalenti perché strutturalmente identici (sono entrambi int per la macchina C)

• Quindi, A=B è un assegnamento lecito.

Page 24: TIPI DI DATO Un tipo di dato T è definito come: un dominio di valori, D un insieme di funzioni F 1,..,F n sul dominio D un insieme di predicati P 1,..,P.

EQUIVALENZA NOMINALE

• Non è il caso del C, ma è il caso, per esempio, del Pascal

• Esempio di equivalenza nominale

type MioIntero = integer;

type NuovoIntero = integer;

var A: MioIntero;

var B: NuovoIntero;

• I due tipi MioIntero e NuovoIntero non sono equivalenti perché definiti in una diversa definizione (A:=B è rigettata!)

Page 25: TIPI DI DATO Un tipo di dato T è definito come: un dominio di valori, D un insieme di funzioni F 1,..,F n sul dominio D un insieme di predicati P 1,..,P.

DEFINIZIONE DI TIPI STRUTTURATI

• Abbiamo visto a suo tempo come introdur-re variabili di tipo array e struttura:char msg1[20], msg2[20];

struct persona {...} p,q;

• Non potendo però dare un nome al nuovo tipo, dovevamo ripetere la definizione per ogni nuova variabile– per le strutture potevamo evitare di ripetere la parte

fra {..}, ma struct persona andava ripetuto comunque.

Page 26: TIPI DI DATO Un tipo di dato T è definito come: un dominio di valori, D un insieme di funzioni F 1,..,F n sul dominio D un insieme di predicati P 1,..,P.

DEFINIZIONE DI TIPI STRUTTURATI

• Ora possiamo definire un nuovo tipo array e struttura, come segue:typedef char string[20];

typedef struct {... } persona;

• ciò consente, d’ora in poi, di non dover più ripetere la definizione per esteso ogni volta che si definisce una nuova variabile:string s1, s2; /* due stringhe di 20 caratteri */

persona p1, p2; /* due strutture “persona” */

– per le strutture, ciò rende quasi sempre inutile spe-cificare una etichetta dopo la parola chiave struct

Page 27: TIPI DI DATO Un tipo di dato T è definito come: un dominio di valori, D un insieme di funzioni F 1,..,F n sul dominio D un insieme di predicati P 1,..,P.

DEFINIZIONE DI TIPI STRUTTURATI

• Ora possiamo definire un nuovo tipo array e struttura, come segue:typedef char string[20];

typedef struct {... } persona;

• ciò consente, d’ora in poi, di non dover più ripetere la definizione per esteso ogni volta che si definisce una nuova variabile:string s1, s2; /* due stringhe di 20 caratteri */

persona p1, p2; /* due strutture “persona” */

– per le strutture, ciò rende quasi sempre inutile spe-cificare una etichetta dopo la parola chiave struct

Attenzione: è una definizione di tipo, non di variabile! Non crea nessuna variabile!

Page 28: TIPI DI DATO Un tipo di dato T è definito come: un dominio di valori, D un insieme di funzioni F 1,..,F n sul dominio D un insieme di predicati P 1,..,P.

DEFINIZIONE DI NUOVI TIPI

Perché definire nuovi tipi è importante?

• Permette di progettare al nostro livello di astrazione, non a quello della macchina C– Il mondo reale è fatto di giorni, temperature, colori,

stringhe... non di int, char, etc!!– operare su “stringhe”, “matrici”, “vettori” è ben

diverso che operare su char x[20], etc

• Consente di prescindere dalla rappresenta-azione concreta delle cose– temperature, colori, interi... saranno anche tutti int,

alla fine... ma concettualmente sono diversi!

Page 29: TIPI DI DATO Un tipo di dato T è definito come: un dominio di valori, D un insieme di funzioni F 1,..,F n sul dominio D un insieme di predicati P 1,..,P.

TIPI DI DATO ASTRATTO (ADT)

Un tipo di dato astratto (ADT) definisce una categoria concettuale con le sue proprietà:

una definizione di tipo implica un dominio, D

un insieme di operazioni ammissibili su oggetti di quel tipo funzioni: calcolano valori sul dominio D

predicati: calcolano proprietà vere o false su D

Page 30: TIPI DI DATO Un tipo di dato T è definito come: un dominio di valori, D un insieme di funzioni F 1,..,F n sul dominio D un insieme di predicati P 1,..,P.

TIPI DI DATO ASTRATTO IN C

In C, un ADT si costruisce definendo:

il nuovo tipo con typedef una funzione per ogni operazione

Esempio: il contatore una entità caratterizzata da un valore intero

typedef int counter; con operazioni per

resettare il contatore a zero reset(counter);

incrementare il contatore inc(counter);

Page 31: TIPI DI DATO Un tipo di dato T è definito come: un dominio di valori, D un insieme di funzioni F 1,..,F n sul dominio D un insieme di predicati P 1,..,P.

ORGANIZZAZIONE DI UN ADT IN C

La struttura di un ADT comprende quindi:

un file header, contenente la typedef

la dichiarazione delle funzioni

un file di implementazione, contenente una direttiva #include per includere il proprio

header (per importare la definizione di tipo)

la definizione delle funzioni

Page 32: TIPI DI DATO Un tipo di dato T è definito come: un dominio di valori, D un insieme di funzioni F 1,..,F n sul dominio D un insieme di predicati P 1,..,P.

L’ADT counter file header counter.h

typedef int counter;void reset(counter);void inc(counter);

file di implementazione counter.c#include "counter.h"void reset(counter c){ c=0; }void inc(counter){ c++; }

Definisce in astratto cos’è un counter e co-sa si può fare con esso.

Ha bisogno di sapere cos’è un counter, e specifica come funziona.

Page 33: TIPI DI DATO Un tipo di dato T è definito come: un dominio di valori, D un insieme di funzioni F 1,..,F n sul dominio D un insieme di predicati P 1,..,P.

L’ADT counter: un cliente

Per usare un counter occorre includere il relativo file header definire una o più variabili di tipo counter operare su tali “oggetti” mediante le

operazioni (funzioni) previste

#include "counter.h"

main(){ counter c1, c2; reset(c1); reset(c2); inc(c1); inc(c2); inc(c2);}

Page 34: TIPI DI DATO Un tipo di dato T è definito come: un dominio di valori, D un insieme di funzioni F 1,..,F n sul dominio D un insieme di predicati P 1,..,P.

RIFLESSIONE

Quali operazioni per un ADT?

costruttori costruiscono un oggetto di questo tipo (a partire

dai suoi “costituenti elementari”)

selettori restituiscono uno dei “mattoni elementari” che

compongono l’oggetto

predicati verificano la presenza di una proprietà

sull’oggetto, restituendo vero o falso

Page 35: TIPI DI DATO Un tipo di dato T è definito come: un dominio di valori, D un insieme di funzioni F 1,..,F n sul dominio D un insieme di predicati P 1,..,P.

RIFLESSIONE

Quali operazioni per un ADT?

funzioni agiscono in vario modo sugli oggetti

trasformatori cambiano lo stato dell’oggetto

Possono esserci o no: se non ci sono, l’oggetto non ha stato, ossia non è modificabile.

Decidere se fare un oggetto con o senza stato è una scelta cruciale di progetto: mai farla a caso!

Page 36: TIPI DI DATO Un tipo di dato T è definito come: un dominio di valori, D un insieme di funzioni F 1,..,F n sul dominio D un insieme di predicati P 1,..,P.

ESERCIZIO

Realizzare l’ADT che cattura il concetto di“stringa di al più 250 caratteri”

realizzazione fisica basata su un array di caratteri (ed eventualmente la dimensione)

operazioni per estrarre il carattere situato alla i-esima posizione

calcolare la lunghezza

creare una nuova stringa che sia la concatena-zione di due stringhe date

confrontare due stringhe...

Page 37: TIPI DI DATO Un tipo di dato T è definito come: un dominio di valori, D un insieme di funzioni F 1,..,F n sul dominio D un insieme di predicati P 1,..,P.

ESERCIZIO

Realizzare l’ADT che cattura il concetto di“stringa di al più 250 caratteri”

realizzazione fisica basata su un array di caratteri (ed eventualmente la dimensione)

operazioni per estrarre il carattere situato alla i-esima posizione

calcolare la lunghezza

creare una nuova stringa che sia la concatena-zione di due stringhe date

confrontare due stringhe...

Selettore

Selettore o funzione

Costruttore?

Funzione

Non ci sono trasformatori: questo ADT “stringa” è privo di stato.Una stringa non è un contenitore!!

Page 38: TIPI DI DATO Un tipo di dato T è definito come: un dominio di valori, D un insieme di funzioni F 1,..,F n sul dominio D un insieme di predicati P 1,..,P.

ESERCIZIO

Realizzare l’ADT che cattura il concetto di“insieme” (di interi)

realizzazione fisica basata, ad esempio, su una struttura con un array e un indice

operazioni per aggiungere un elemento, togliere un elemento,

verificare la presenza di un elemento...

... calcolare l’unione di due insiemi, la differenza fra due insiemi, l’intersezione, etc

ricorda: un insieme non ha una nozione di ordine, e non può avere elementi duplicati

Page 39: TIPI DI DATO Un tipo di dato T è definito come: un dominio di valori, D un insieme di funzioni F 1,..,F n sul dominio D un insieme di predicati P 1,..,P.

ESERCIZIO

Realizzare l’ADT che cattura il concetto di“insieme” (di interi)

realizzazione fisica basata, ad esempio, su una struttura con un array e un indice

operazioni per aggiungere un elemento, togliere un elemento,

verificare la presenza di un elemento...

... calcolare l’unione di due insiemi, la differenza fra due insiemi, l’intersezione, etc

ricorda: un insieme non ha una nozione di ordine, e non può avere elementi duplicati

Trasformatori

Predicato

Ci sono trasformatori: questo ADT “in-sieme” possiede una nozione di stato.

Page 40: TIPI DI DATO Un tipo di dato T è definito come: un dominio di valori, D un insieme di funzioni F 1,..,F n sul dominio D un insieme di predicati P 1,..,P.

ADT: PROBLEMI OPERATIVI L’intera struttura degli ADT in C si basa

sulla presenza della typedef nel file header che introduce il tipo

Dubbio tremendo: è una dichiarazione o una definizione..???? a rigore, non crea nuove variabili né nuove

funzioni, non genera un solo byte di codice: dunque, sembrerebbe una dichiarazione...

... e invece per il C è una definizione, e come tale non può essere duplicata!

Argh!

Page 41: TIPI DI DATO Un tipo di dato T è definito come: un dominio di valori, D un insieme di funzioni F 1,..,F n sul dominio D un insieme di predicati P 1,..,P.

ADT: PROBLEMI OPERATIVI Ogni cliente deve necessariamente

includere il file header che contiene la typedef altrimenti il nome del nuovo tipo risulta ignoto

però, essendo una definizione, se per caso viene inclusa due volte nella stessa unità di traduzione si ha errore di compilazione è un errore di compilazione, non di linking

infatti, poiché la typedef non produce codice, nulla di tutto questo giunge al linker, che quindi non ha motivo di protestare.

Page 42: TIPI DI DATO Un tipo di dato T è definito come: un dominio di valori, D un insieme di funzioni F 1,..,F n sul dominio D un insieme di predicati P 1,..,P.

ADT: PROBLEMI OPERATIVI Come evitare il problema?

Sfruttando il pre-processore per sopprime-re le eventuali typedef duplicate incluse per errore nella stessa unità di traduzione

Più precisamente, si sfrutta la direttiva

#ifndef simbolo(parte di programma con la typedef)

#endif

che permette di sopprimere la parte di programma “rischiosa” se simbolo è già definito.

Page 43: TIPI DI DATO Un tipo di dato T è definito come: un dominio di valori, D un insieme di funzioni F 1,..,F n sul dominio D un insieme di predicati P 1,..,P.

USARE LA #ifndef...

Occorre seguire uno schema standard:

#ifndef simbolo

#define simbolo

(parte di programma con la typedef)

#endif

La prima volta, simbolo non è definito lo si definisce si include la parte di programma con typedef

Le volte successive, simbolo è già definito la parte di programma con typedef è soppressa

Page 44: TIPI DI DATO Un tipo di dato T è definito come: un dominio di valori, D un insieme di funzioni F 1,..,F n sul dominio D un insieme di predicati P 1,..,P.

USARE LA #ifndef...

Occorre seguire uno schema standard:

#ifndef simbolo

#define simbolo

(parte di programma con la typedef)

#endif

La prima volta, simbolo non è definito lo si definisce si include la parte di programma con typedef

Le volte successive, simbolo è già definito la parte di programma con typedef è soppressa

Di solito, simbolo è il nome del fileFile: counter.hSimbolo: counter_h

Importante: perché questo schema funzioni occorre che venga usato in tutti i file di un progetto, sistematica-mente!

Page 45: TIPI DI DATO Un tipo di dato T è definito come: un dominio di valori, D un insieme di funzioni F 1,..,F n sul dominio D un insieme di predicati P 1,..,P.

L’ADT counter RIFORMULATO

file header counter.h

#ifndef counter_h

#define counter_h

typedef int counter;

#endif

void reset(counter);void inc(counter);

il file counter.c e i clienti rimangono tali e quali a prima, intoccati.

L’endif potrebbe anche essere in fondo al file: non è necessario ma si fa spesso per comodità.

Page 46: TIPI DI DATO Un tipo di dato T è definito come: un dominio di valori, D un insieme di funzioni F 1,..,F n sul dominio D un insieme di predicati P 1,..,P.

L’ADT IN C: LIMITI

Gli ADT così realizzati funzionano, ma molto dipende dall’autodisciplina del programmatore

Non esiste alcuna protezione contro un uso scorretto dell’ADT l’organizzazione suggerisce di operare sull’oggetto

solo tramite le funzioni previste, ma non riesce a impedire di aggirarle a chi lo volesse

La struttura interna dell’oggetto è sotto gli occhi di tutti (nella typedef)

Page 47: TIPI DI DATO Un tipo di dato T è definito come: un dominio di valori, D un insieme di funzioni F 1,..,F n sul dominio D un insieme di predicati P 1,..,P.

L’ADT IN C: LIMITI

Gli ADT così realizzati funzionano, ma molto dipende dall’autodisciplina del programmatore

Non esiste alcuna protezione contro un uso scorretto dell’ADT l’organizzazione suggerisce di operare sull’oggetto

solo tramite le funzioni previste, ma non riesce a impedire di aggirarle a chi lo volesse

La struttura interna dell’oggetto è sotto gli occhi di tutti (nella typedef)

Superare questi limiti sarà uno degli obiettivi cruciali della programmazione a oggetti, che vedremo nella seconda parte del corso con il linguaggio Java.