FONDAMENTI DI INFORMATICA
Prof. PIER LUCA MONTESSORO Ing. DAVIDE PIERATTONI
Facoltà di Ingegneria
Università degli Studi di Udine
Linguaggio C
Struct e union
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
Nota di Copyright
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
Sintassi
struct punto {
int x;
int y;
};
struct punto p1, p2;
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
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;
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;
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);
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
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));
}
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;
Strutture ricorsive
struct list_element {
int value;
struct list_element *next;
};
value next
?
value next
value next
!
• 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
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
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;
0
data
2 3 4 5 6 16 7
L’uso è identico a quello dei campi delle strutture:
r.id = 3;
test
scsi id
extst intdis ts pty