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