PDA

Visualizza la versione completa : Strutture ed Unioni


SkOrPiOn`87
04-12-2003, 20:20
Ciao, qualcuno puo spiegarmi la differenza tra strutture ed unioni, e quando è bene utilizzare una al posto dell'altra?


Grazie :ciauz:

}gu|do[z]{®©
04-12-2003, 20:53
le struttura allocano memoria per ogni elemento della struttura, le unioni allocano una sola memoria, grande quanto il più grande elemento che contengono... e questa memoria viene assegnata ad un solo elemento per volta....

le strutture si usano per raggruppare degli elementi, le unioni per raggruppare elementi mutuamente esclusivi...

in questo momnento no ho molta fantasia per farti un esempio sorry :fagiano:

SkOrPiOn`87
05-12-2003, 01:56
Va bhe grazie ugualmente :ciauz:

Magari qualcuno l'avrà... :tongue:

LeleFT
05-12-2003, 17:03
Una struttura non è nient'altro che un record: la sua dimensione in memoria equivale alla somma delle dimensioni di ciascun suo campo.
Esempio:


struct miorecord {
char nome[20];
char cognome[20];
int eta;
}

Questa struttura occupa 44 byte (supponendo un intero di 4 byte)


La Union è, invece, il raggruppamento di tante componenti nella minima unità di memoria in grado di contenerle.
Esempio:


union miaunion {
int valore;
char primobyte;
char secondobyte;
char terzobyte;
char quartobyte;
}

Questa union occupa esattamente 4 byte (supponendo, sempre, un intero di 4 byte)

Nell'ultimo esempio le quattro variabili char rappresentano, ciascuna, un byte dell'intero: in questo modo è possibile avere in memoria una variabile di tipo intero e riuscire ad indirizzare ciascun byte di quella variabile in modo indipendente. E' molto utile, questo tipo di dato, quando si devono analizzare dei flag: supponiamo di avere una variabile char (che occupa un byte) che rappresenta una serie di 8 flag che controllano una determinata periferica. Avendo a disposizione una struttura, che mi rappresenta un campo di bit, ed una union io posso analizzare il byte ricevuto dalla periferica per sapere se un determinato bit è settato o meno. Ecco come:


struct campobit {
unsigned a7 : 1;
unsigned a6 : 1;
unsigned a5 : 1;
unsigned a4 : 1;
unsigned a3 : 1;
unsigned a2 : 1;
unsigned a1 : 1;
unsigned a0 : 1;
};

union mioflag {
struct campobit campo;
char bytericevuto;
};

...

mioflag flg;
flg.bytericevuto = get_da_periferica(); // ottengo il byte dalla periferica

// controllo il 4° bit
if (flg.campo.a3) {
// il bit è settato
} else {
// il bit non è settato
}

Ecco quello che c'è in memoria:
|---------------------------------------|
| a7 | a6 | a5 | a4 | a3 | a2 | a1 | a0 |
|------------- bytericevuto ------------|

Spero di averti aiutato a comprendere le potenzialità offerte da questi due tipi di dato (combinandoli, anche).


Ciao.

Loading