next up previous contents index
Next: La keywordtypedef Up: Tipi di dati complessi Previous: Strutture e unioni   Indice   Indice analitico


Una utile estensione delle struct: I campi di bit

Come detto, esiste un altro tipo di dato aggregato, molto utile per la gestione a basso livello della memoria, il bitfield. L' impiego di campi di bit si rende necessario quando si voglia accedere ai singoli bit. In generale, un bitfield è definito in maniera analoga a quanto segue:

struct nome_struttura{

type nome_var1 : dimensione1;
type nome_var2 : dimensione2;
type nome_var3 : dimensione3;
}

struct_nomestruttura mia_var;
Dove type realizza il tipo del campo di bit:

Si possono avere:

 int, unsigned, signed
Ovviamente, ove si necessiti di un singolo bit, si scriverà
unsigned.
Inoltre, la dimensione indicata deve corrispondere al numero di bit singoli che il campo comprende.

L'accesso e le istruzioni di assegnazione di un valore ai membri di una variabile di tale tipo, avvengono in maniera esattamente analoga alle comuni strutture.

es.:

        struct byte_acchiappato_dalla_seriale{

                unsigned primo: 1;
                unsigned secondo: 1;
                unsigned terzo: 1;
                unsigned quarto: 1;
                unsigned quinto: 1;
                unsigned sesto: 1;
                unsigned settimo: 1;
                unsigned ultimo: 1;

        }arrivato;

Volendo interpretare i bit della struttura sopra come valori boleani, si potrebbe voler fare un controllo del tipo:

if (arrivato.primo) printf("\t Ma chi te lo ha fatto fare\n");

Ovvero, voler fare un semplice assegnamento del tipo:

        arrivato.primo = 0;
        arrivato.ultimo = 1;

Se qualcuno volesse sapere quale sia il piazzamento ottenuto, basterebbe verificare quale sia il bit settato ad uno (ovvero: qule campo restituisce il valore VERO).

In maniera abbastanza palese, l'esempio sopra non è economico come sembra a prima vista, tuttavia serve a mostrarere l'impiego pratico dei campi di bit. L'utilità vera è nella possibilità di impiegare, ove sia possibile, il quanto minimo di informazione, laddove un intero byte rappresenterebbe uno spreco inutile di risorse cruciali. Il caso tipico è rappresentato dalla scrittura di un kernel, dove è inoltre necessario controllare i singoli registri della CPU. Il C non sarebbe il linguaggio potente e versatile che di fatto è, se non avesse questa importante caratteristica, che permette di evitare l'impiego del linguaggio assembly laddove con altri linguaggi non sarebbe possibile.



Subsections
next up previous contents index
Next: La keywordtypedef Up: Tipi di dati complessi Previous: Strutture e unioni   Indice   Indice analitico
blacksheep & 2006-11-22