Premessa all`implementazione di dati astratti Struttura di un progetto

Transcript

Premessa all`implementazione di dati astratti Struttura di un progetto
Struttura di un progetto DEV C++
Corso di Linguaggi e Traduttori 1
AA 2004-05
Struttura del progetto:
► file .h : intestazioni (header)
Premessa
all’implementazione di dati
astratti
► file .c : codice sorgente
► main.c : file principale per l’uso e la validazione di
codice e/o strutture dati
1
Esempio: Implementazione statica
dello Stack
2
Esempio: Implementazione statica
dello Stack
Struttura del progetto:
►Utils.h
♦ Definizione delle macro
► file .h
♦ Definizione degli errori e dei messaggi
♦ Utils.h
♦ Definizione di tipi (per es. Boolean)
► Stack.h
♦ Stack.h
♦ Auto_stack.h
♦ Definizione delle interfacce (specifica sintattica)
► Stack_item.h
♦ Stack_item.h
♦ Definizione del tipo Item
► Auto_stack.h
♦ Implementazione della struttura dati
3
4
Esempio: Implementazione statica
dello Stack
Direttive
Struttura del progetto:
Le direttive sono delle particolari istruzioni che
vengono date al compilatore.
►File .c
♦ Utils.c
○ Implementazione delle funzioni di utility
Esse permettono di espandere
dell’ambiente di programmazione.
♦ Auto_stack.c
○ Implementazione delle interfacce
♦ Test_stack_suite_1.c
le
potenzialità
Direttive per il prepocessore
○ Esempi d’uso della struttura dati
♦ Test_auto_stack.c
○ Inizializzazione automatica della struttura dati
5
Direttive Condizionali
6
Direttive Condizionali: Esempio
Le direttive condizionali consentono di compilare in
modo arbitrario una porzione di codice
( direttive di compilazione condizionale)
Es.
#if espressione_costante (se è vera)
<blocco di codice>
#endif
#ifndef __UTILS
#define __UTILS
…
#endif
espressione_costante deve essere una costante
o un identificatore precedentemente definito
NON è consentito l’uso di variabili in quanto #if
viene valutata al lato della compilazione.
7
8
Definizione di Macro
Definizione di Macro: Esempio
►Gli identificatori sono realizzati attraverso l’uso
delle direttiva #define.
► #define
NEW(type) (type *) malloc(sizeof(type))
►La macro fa uso della funzione malloc() la quale
restituisce un puntatore al primo byte di una regione
di memoria di dimensione sizeof(type) allocata dallo
►L’identificatore corrisponde al nome della macro
heap.
►Esempio:
/* MACROS DEFINITIONS*/
#define NEW (type) (type *) malloc(sizeof(type))
►Se la memoria disponibile nello heap non è
sufficiente malloc() restituisce un puntatore nullo!!
#define NEW_ARRAY(type,size) (type *)
calloc(size,sizeof(type))
#define DELETE(ptr) free(ptr)
► ATTENZIONE: l’uso di un puntatore nullo provoca
l’arresto del sistema
9
Diefinizione di tipi
10
Enum (Enumerazioni)
►Un nuovo tipo può essere definito usando la parola
chiave typedef.
►typedef enum { False, True } Boolean ;
►Le enumerazioni sono degli elenchi di costanti intere a
cui viene associato un nome, nello specifico
►Esempio:
typedef double Item ; // Item <=> double
►False è associato 0
►True viene associato 1.
typedef enum { False, True } Boolean ;
11
12
Struct
Struct: Esempio
► Le strutture (struct) sono dei raggruppamenti di
più variabili di tipo differente sotto lo stesso
nome, vengono chiamate tipi aggregati
► Le variabili che compongono una struttura sono
chiamate campi
ƒ Per accedere ad un campo della struttura dati
si usa l’operatore punto “.”
Esempio: stack.index=10
ƒ Se si fa uso di un puntatore a struttura si
accede ai campi con l’operatore freccia“->”
Esempio: s -> index=10
►Definizione
struct stack {
int index ;
Item buffer[MAXSTK] ;
} ;
►Definizione di un nuovo tipo
typedef struct stack * STACK ;
►Esempio di invocazione
S->buffer[S->index] ;
13
14