Visualizzazione dei risultati da 1 a 8 su 8

Discussione: [C]campi di bit

  1. #1

    [C]campi di bit

    Tempo fa ho trovato informazioni riguardo ad un particolare struct che si poteva creare in C che veniva definito a campi di bit...

    Attraverso questi campi si potevano creare struct contenti delle variabili che occupavano (anche se in maniera astratta) un bit.. e quindi di poteva creare uno struct byte in cui si poteva modificare bit per bit...

    lo struct è il seguente


    codice:
    struct byte {
    
    	unsigned char b0 : 1;
    	unsigned char b1 : 1;
    	unsigned char b2 : 1;
    	unsigned char b3 : 1;
    	unsigned char b4 : 1;
    	unsigned char b5 : 1;
    	unsigned char b6 : 1;
    	unsigned char b7 : 1;
    
    
    
    };
    Quel : 1 indica che la grandezza della variabile deve essere di 1 bit...

    tutto funziona e se faccio sizeof su quello struct ricevo 1 .. cioè 1 byte...

    il problema è questo.. io devo fare un programma che lavori con questi campi e quindi ho deciso di fare un vettore di 8 elementi ciascunop da 1 bit per formare il byte evitando di scrivere b1,b2,b3... ecc... che renderebbero scomodissimo il lavoro...

    quindi ho provato a fare una roba del genere...

    codice:
    struct byte {
    
        unsigned char b[8] : 1;
    
    };
    Ma non funziona.. Visual C mi dice :

    'b' : bit field cannot have indirection

    E non so come procedere.. se qualcuno sa come precedere... Grazie mille a tutti e ciao!!!
    "Penso che nel mondo ci sia mercato per quattro o cinque computer"... Thomas Watson, presidente della IBM, 1943

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,326
    Sinceramente non so se si possa fare quello che chiedi... poi, io ho utilizzato i campi di bit omettendo il tipo di ciascun campo, in questo modo:
    codice:
    struct campo {
       unsigned a0 : 1;
       unsigned a1 : 1;
       unsigned a2 : 1;
       unsigned a3 : 1;
       unsigned a4 : 1;
       unsigned a5 : 1;
       unsigned a6 : 1;
       unsigned a7 : 1;
    }
    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2003
    Messaggi
    423
    Guarda, al limite invece di farla come campo di bit puoi usare un array di bool ... Non credo si possa fare quello che vorresti tu;

  4. #4
    Utente di HTML.it L'avatar di Ilmalcom
    Registrato dal
    Oct 2002
    Messaggi
    1,345
    Originariamente inviato da pprllo
    Guarda, al limite invece di farla come campo di bit puoi usare un array di bool ... Non credo si possa fare quello che vorresti tu;
    Prego?

  5. #5
    Utente di HTML.it
    Registrato dal
    Dec 2003
    Messaggi
    423
    Non mi pare che si possa dichiarare un campo di bit con gli array, per cui invece dei bit potrebbe usare dei bool, di cui si possono benissimo fare array.

  6. #6
    Utente di HTML.it L'avatar di Ilmalcom
    Registrato dal
    Oct 2002
    Messaggi
    1,345
    Originariamente inviato da pprllo
    Non mi pare che si possa dichiarare un campo di bit con gli array, per cui invece dei bit potrebbe usare dei bool, di cui si possono benissimo fare array.
    I bool sono interi, quindi sono rappresentati, sulla maggiore parte dei sistemi, su 32 bit. Non mi sembra sia quello che vuole lui...

  7. #7
    Utente di HTML.it
    Registrato dal
    Dec 2003
    Messaggi
    423
    Ah è vero sono rappresentati come char ... mmm ... allora potresti fare una cosa tipo:

    codice:
    struct byte
    {
    	unsigned char a: 1;
    	unsigned char b: 1;
    	unsigned char c: 1;
    	unsigned char d: 1;
    	unsigned char e: 1;
    	unsigned char f: 1;
    	unsigned char g: 1;
    	unsigned char h: 1;
    };
    
    int getbit(byte &a, unsigned int i)
    {
    	if (i>=8) return false;
    	switch (i)
    	{
    		case 0: return a.a;
    		case 1: return a.b;
    		case 2: return a.c;
    		case 3: return a.d;
    		case 4: return a.e;
    		case 5: return a.f;
    		case 6: return a.g;
    		case 7: return a.h;
    	}
    	return false;
    }
    void setbit(byte &a, unsigned int i, unsigned int u)
    {
    	if ((u!=0 && u!=1) || i>=8) return;
    	switch (i)
    	{
    		case 0: a.a = u; break;
    		case 1: a.b = u; break;
    		case 2: a.c = u; break;
    		case 3: a.d = u; break;
    		case 4: a.e = u; break;
    		case 5: a.f = u; break;
    		case 6: a.g = u; break;
    		case 7: a.h = u; break;
    	}
    }
    Non mi viene in mente altro ...

  8. #8
    grazie mille per le risposte...
    Quando inizierò a lavorarci e combinarò qualcosa vi farò sapere....

    Ciao ciao!!
    "Penso che nel mondo ci sia mercato per quattro o cinque computer"... Thomas Watson, presidente della IBM, 1943

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.