FONDAMENTI DI INFORMATICA Prof. PIER LUCA MONTESSORO Ing. DAVIDE PIERATTONI Facoltà di Ingegneria Università degli Studi di Udine Linguaggio C Struct e union 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 1
Nota di Copyright Questo insieme di trasparenze (detto nel seguito slide) è protetto dalle leggi sul copyright e dalle disposizioni dei trattati internazionali. Il titolo ed i copyright relativi alle slides (ivi inclusi, ma non limitatamente, ogni immagine, fotografia, animazione, video, audio, musica e testo) sono di proprietà degli autori prof. Pier Luca Montessoro e ing. Davide Pierattoni, Università degli Studi di Udine. Le slide possono essere riprodotte ed utilizzate liberamente dagli istituti di ricerca, scolastici ed universitari afferenti al Ministero della Pubblica Istruzione e al Ministero dell Università e Ricerca Scientifica e Tecnologica, per scopi istituzionali, non a fine di lucro. In tal caso non è richiesta alcuna autorizzazione. Ogni altro utilizzo o riproduzione (ivi incluse, ma non limitatamente, le riproduzioni su supporti magnetici, su reti di calcolatori e stampe) in toto o in parte è vietata, se non esplicitamente autorizzata per iscritto, a priori, da parte degli autori. L informazione contenuta in queste slide è ritenuta essere accurata alla data della pubblicazione. Essa è fornita per scopi meramente didattici e non per essere utilizzata in progetti di impianti, prodotti, reti, ecc. In ogni caso essa è soggetta a cambiamenti senza preavviso. Gli autori non assumono alcuna responsabilità per il contenuto di queste slide (ivi incluse, ma non limitatamente, la correttezza, completezza, applicabilità, aggiornamento dell informazione). In ogni caso non può essere dichiarata conformità all informazione contenuta in queste slide. In ogni caso questa nota di copyright e il suo richiamo in calce ad ogni slide non devono mai essere rimossi e devono essere riportati anche in utilizzi parziali. 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 2
Strutture Le strutture sono collezioni di una o più variabili, di uno o più tipi. Esempio: impiegato char nome[32] char cognome[64] int cod_qualifica int cod_ufficio residenza residenza char via[32] int numero char cap[6] char citta[32] 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 3
parola chiave Sintassi nome della struttura campi, o membri, della struttura struct punto int x; int y; }; struct punto p1, p2; variabili di tipo struct punto 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 4
Sintassi Una dichiarazione struct definisce un tipo Una dichiarazione di struttura che non sia seguita da una lista di variabili non riserva alcuna area di memoria! struct punto int x; int y; }; struct punto p1; dichiarazione definizione struct punto int x; int y; } p1; 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 5
Sintassi In un espressione, un campo di una particolare struttura è individuato dal costrutto nome_struttura.campo Ad esempio la sintassi: a.x individua la coordinata x del punto a. Assegnamento di un campo: a sia l origine del riferimento cartesiano a.x = 0; a.y = 0; 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 6
Uso delle strutture struct punto int x; int y; }; struct punto origine = 0, 0}; struct punto p1, p2;... printf ("coordinate di p1: %d, %d\n", p1.x, p1.y); struct rettangolo struct punto basso_s; struct punto alto_d; } r;... area = (r.alto_d.x - r.basso_s.x) * (r.alto_d.y - r.basso_s.y); 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 7
Copia Operazioni sulle strutture Assegnazione come unico oggetto Indirizzamento tramite operatore & Manipolazione tramite l'accesso ai suoi campi Inizializzazione con una lista di valori costanti, uno per ogni campo La copia e l'assegnamento comprendono anche il passaggio di strutture alle funzioni e il ritorno di valori dalle funzioni Le strutture non possono essere confrontate 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 8
struct punto int x; int y; }; Esempio double distanza (struct punto a, struct punto b) /* calcola la distanza tra due punti */ return sqrt ((a.x-b.x)*(a.x-b.x) + (a.y-b.y)*(a.y-b.y)); } 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 9
Esempio struct rettangolo struct punto v_as; /* vertice in alto a destra */ struct punto v_bd; /* vertice in basso a sinistra */ }; struct rettangolo dallorigine (struct punto p) /* costruisce un rettangolo con il vertice in basso a sinistra nell'origine e quello opposto in p */ struct rettangolo r; r.v_as.x = 0; r.v_as.y = p.y; r.v_bd.x = p.x; r.v_bd.y = 0; } return r; 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 10
Strutture ricorsive struct list_element int value; struct list_element *next; }; value next value next value next?! 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 11
Bit field Alle volte può essere necessario inserire diversi oggetti in un unica word (o unità di memoria) della macchina Un bit field è un insieme di bit adiacenti all interno di una word La definizione di un bit field segue la sintassi propria delle strutture: struct unsigned int first_field: 1; unsigned int second_field: 3; unsigned int third_field: 1; } flags; Questa dichiarazione definisce una variabile flags che contiene tre field, il primo e il terzo di un bit, il secondo di tre bit. 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 12
Bit field Ai singoli field si accede in modo analogo a quanto avviene per i campi delle struct flags.first_field = flags.third_field = 1; flags.third_field = 5; I field sono equiparabili a degli interi, e quindi possono intervenire in espressioni aritmetiche Le operazioni sui field dipendono fortemente dalla macchina 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 13
Bit field 16 7 6 5 4 3 2 0 data extst intdis ts pty test scsi id struct scsi_regi unsigned id : 3; unsigned test : 1; unsigned pty : 1; unsigned ts : 1 unsigned intdis : 1 unsigned extst : 1 char data; } r; L uso è identico a quello dei campi delle strutture: r.id = 3; 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 14
Union Una union è una variabile che può contenere in istanti diversi oggetti di tipo e dimensioni differenti, condividendo lo stesso spazio in memoria. struct tabella char *nome; int tipo; union int ival; float fval; char *sval; } } tab[maxdim];... if (tab[i].tipo == INT) printf ("%d\n", tab[i].ival); if (tab[i].tipo == FLOAT) printf ("%f\n", tab[i].fval); if (tab[i].tipo == STRING) printf ("%s\n", tab[i].sval);... 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 15
Typedef Permette di definire dei nuovi tipi, che poi possono essere impiegati come i tipi nativi del linguaggio. Può essere utilizzato facendo riferimento ai tipi base: typedef int lunghezza; lunghezza l, maxl, *misura (struct oggetto); oppure può essere usato per strutture e union: typedef struct int x; int y; } punto; punto p1, p2; 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 16