Fondamenti di Informatica
© 2001 Pier Luca Montessoro, Davide Pierattoni (si veda la nota di copyright alla slide n. 2)
1
Fondamenti di Informatica - Linguaggio C - Struct e union
© 2001 Pier Luca Montessoro - Davide Pierattoni ( vedere nota di copyright a pag. 2) 1
FONDAMENTI DI INFORMATICA
Prof . PIER LUCA MONTESSORO Ing. DAVIDE PIERATTONI
Facoltà di Ingegneria Università degli Studi di Udine
Linguaggio C Struct e union
Fondamenti di Informatica - Linguaggio C - Struct e union
© 2001 Pier Luca Montessoro - Davide Pierattoni ( vedere nota di copyright a pag. 2) 2 Questo insieme d i 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 d i 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 d i 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 i n progetti d i impianti , prodotti , reti, ecc. In ogni caso essa è soggetta a cambiamenti senza preavviso. Gli autori non assumono alcuna responsabilità per il contenuto d i 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 a d ogni slide non devono mai essere rimossi e devono essere riportati anche in utilizzi parziali.
Nota di Copyright
Fondamenti di Informatica - Linguaggio C - Struct e union
© 2001 Pier Luca Montessoro - Davide Pierattoni ( vedere nota di copyright a pag. 2) 3
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
char via[32]
int numero char cap[6]
char citta[32]
residenza
Fondamenti di Informatica - Linguaggio C - Struct e union
© 2001 Pier Luca Montessoro - Davide Pierattoni ( vedere nota di copyright a pag. 2) 4
Sintassi
struct punto {
int x;
int y;
};
struct punto p1, p2;
parola chiave
nome della struttura
variabili di tipo struct punto campi,
o membri, della struttura
Fondamenti di Informatica - Linguaggio C - Struct e union
© 2001 Pier Luca Montessoro - Davide Pierattoni ( vedere nota di copyright a pag. 2) 5
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!
dichiarazione
definizione struct punto
{ int x;
int y;
};
struct punto p1;
struct punto {
int x;
int y;
} p1;
Fondamenti di Informatica - Linguaggio C - Struct e union
© 2001 Pier Luca Montessoro - Davide Pierattoni ( vedere nota di copyright a pag. 2) 6
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;
Fondamenti di Informatica
© 2001 Pier Luca Montessoro, Davide Pierattoni (si veda la nota di copyright alla slide n. 2)
2
Fondamenti di Informatica - Linguaggio C - Struct e union
© 2001 Pier Luca Montessoro - Davide Pierattoni ( vedere nota di copyright a pag. 2) 7
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);
Fondamenti di Informatica - Linguaggio C - Struct e union
© 2001 Pier Luca Montessoro - Davide Pierattoni ( vedere nota di copyright a pag. 2) 8
Operazioni sulle strutture
• Copia
• 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
Fondamenti di Informatica - Linguaggio C - Struct e union
© 2001 Pier Luca Montessoro - Davide Pierattoni ( vedere nota di copyright a pag. 2) 9
Esempio
struct punto {
int x;
int y;
};
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));
}
Fondamenti di Informatica - Linguaggio C - Struct e union
© 2001 Pier Luca Montessoro - Davide Pierattoni ( vedere nota di copyright a pag. 2) 10
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;
}
Fondamenti di Informatica - Linguaggio C - Struct e union
© 2001 Pier Luca Montessoro - Davide Pierattoni ( vedere nota di copyright a pag. 2) 11
Strutture ricorsive
struct list_element {
int value;
struct list_element *next;
};
value next
?
value next
value next
!
Fondamenti di Informatica - Linguaggio C - Struct e union
© 2001 Pier Luca Montessoro - Davide Pierattoni ( vedere nota di copyright a pag. 2) 12
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.
Fondamenti di Informatica
© 2001 Pier Luca Montessoro, Davide Pierattoni (si veda la nota di copyright alla slide n. 2)
3
Fondamenti di Informatica - Linguaggio C - Struct e union
© 2001 Pier Luca Montessoro - Davide Pierattoni ( vedere nota di copyright a pag. 2) 13
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
Fondamenti di Informatica - Linguaggio C - Struct e union
© 2001 Pier Luca Montessoro - Davide Pierattoni ( vedere nota di copyright a pag. 2) 14
Bit field
struct scsi_regi {
unsigned id : 3;
unsigned test : 1;
unsigned pty : 1;
unsigned ts : 1 unsigned intdis : 1 unsigned extst : 1 char data;
} r;
0
data
2 3 4 5 6 7 16
L’uso è identico a quello dei campi delle strutture:
r.id = 3;
test
scsi id
extst intdis ts pty
Fondamenti di Informatica - Linguaggio C - Struct e union
© 2001 Pier Luca Montessoro - Davide Pierattoni ( vedere nota di copyright a pag. 2) 15
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);
...
Fondamenti di Informatica - Linguaggio C - Struct e union
© 2001 Pier Luca Montessoro - Davide Pierattoni ( vedere nota di copyright a pag. 2) 16