• Non ci sono risultati.

Università degli Studi di Udine

N/A
N/A
Protected

Academic year: 2021

Condividi "Università degli Studi di Udine"

Copied!
16
0
0

Testo completo

(1)

FONDAMENTI DI INFORMATICA

Prof. PIER LUCA MONTESSORO Ing. DAVIDE PIERATTONI

Facoltà di Ingegneria

Università degli Studi di Udine

Linguaggio C

Struct e union

(2)

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

(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

(4)

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

(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;

(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;

(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);

(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

(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));

}

(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;

(11)

Strutture ricorsive

struct list_element {

int value;

struct list_element *next;

};

value next

?

value next

value next

!

(12)

• 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

(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

(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;

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

(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);

...

(16)

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;

Riferimenti

Documenti correlati

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.. Nota

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. Nota

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.. Nota

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.. Nota

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

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.. Nota

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

In ogni caso non può essere dichiarata conformità all’informazione contenuta in queste slide. In ogni caso questa nota di copyright non deve mai essere rimossa e deve essere