PDA

Visualizza la versione completa : [C] Utilizzo dei bit-field


duonovembre
28-10-2007, 02:11
ho provato ad utilizzare dei bitfield per implementare una semplice struttura (x vedere come funzionano) ma nessuno dei case e degli if viene rispettato, e nn riesco a capire quindi come funzionino esattamente questi bitfield

posto il codice




int main(int argc, char *argv[])
{


struct confronti{
signed int apos :3;
signed int aneg :3;
signed int zpos :3;
signed int zneg :3;
signed int bpos :3;
signed int bneg :3;
signed int abpos :3;
signed int abneg :3;
unsigned int male: 1;
unsigned int femal: 1;
}chek;

chek.zpos = 100;
chek.zneg = 000;
chek.apos = 101;
chek.aneg = 001;
chek.bpos = 110;
chek.bneg = 010;
chek.abpos = 111;
chek.abneg = 011;
chek.male = 1;
chek.femal = 0;


//* il suo sesso (maschio o femmina);
//* il suo gruppo sanguigno (gruppo A, B, AB o 0, con fattore RH positivo o negativo);
//* la sua et (entro limiti ragionevoli);
//* il suo codice di servizio sanitario locale, che composto da una lettera e 4 cifre decimali.
struct persona{
// unsigned int sex : 1;
signed int sex : 1;
signed int blood : 3;
signed short int age;//esiste un uomo in irlanda che e' morto a circa 200 anni quindi servono almeno 9 bit
char *nome;
char *cognome;

}Sanity[10];

int i;
int n;
char a[3];
for(i=0;i<10;i++){
printf("Sesso: 1 Maschio. 0 Femmina ");
scanf("%d",n);
if (n==1)Sanity[i].sex = chek.male;
else Sanity[i].sex = chek.femal;
printf("gruppo sanguigno?");
scanf("%s",a);
switch (a[0]){

case 'a' : {
switch(a[1]){

case '+': Sanity[i].blood = chek.apos;break;
case '-': Sanity[i].blood = chek.aneg;break;
case 'b':{
switch (a[3]){
case '+': Sanity[i].blood = chek.abpos;break;
case '-': Sanity[i].blood = chek.abneg;break;
}}}}}
if (Sanity[i].sex) printf("Maschio ");
else printf("Femmina ");
if (Sanity[i].blood == chek.apos)printf("gruppo sanguigno: A+\n");
if (Sanity[i].blood == chek.aneg)printf("gruppo sanguigno: A-\n");
if (Sanity[i].blood == chek.abpos)printf("gruppo sanguigno: AB+\n");
if (Sanity[i].blood == chek.abneg)printf("gruppo sanguigno: AB-\n");
}








system("PAUSE");
return 0;
}

oregon
28-10-2007, 08:27
I valori numerici

chek.zpos = 100;
chek.zneg = 000;
chek.apos = 101;
chek.aneg = 001;

non sono da intendersi in binario, ma in decimale. Nel primo stai assegnando il valore cento.

Devi scrivere

chek.zpos = 4;
chek.zneg = 0;
chek.apos = 5;
chek.aneg = 1;
...

e cosi' via.

In questa riga

scanf("%d",n);

hai dimenticato l'operatore & per la variabile

scanf("%d", &n);

E' meglio che le struct stiano tutte fuori dal main e che il tipo di dati della enum sia unsigned int.

LeleFT
28-10-2007, 11:09
Il linguaggio: obbligatorio anche nel titolo! :dh:


Ciao. :ciauz:

duonovembre
28-10-2007, 11:28
ma se provi a stamparne i valori (%d) viene fuori la conversione da binario in complemento a 2.
es se stampo 100 mi stampa 4 (con variabile unsigned)



forse sar un caso, perche' altre volte vengono valori inappropriati, invece altre volte vengono giusti. non c'e' modo di effettuare un assegnamento a binario?
(%n)
ooops vero l'ho dimenticato!
eppure nn pregiudicava ne il funzionamento ne il senso, che strano

oregon
28-10-2007, 12:30
Se assegni ad un campo di 3 bit, i valori che puoi utilizzare vanno da 0 a 7 ...

Se a tale campo assegni il valore decimale 100 (cento), vengono assegnati solamente gli ultimi 3 bit a destra, ovvero il valore 100%8 che e' uguale a 4 ... ovvero, dato che 100 (cento) in binario e'

01100100

e che vengono considerati solamente gli ultimi 3 bit a destra, hai quel risultato.

Se tu avessi usato 99, avresti avuto il valore 3 perche' 99%8 e' uguale a 3 ... infatti, in binario 99 e'

01100011

e gli ultimi 3 bit a destra sono

011

ovvero 3.

duonovembre
28-10-2007, 12:42
e come faccio ad assegnare valori in binario o cmq fare cio' ke serve al mio scopo?

oregon
28-10-2007, 12:52
Non puoi assegnare valori in binario, ma non ti serve ...

Se scrivi 3 o 4 e' la stessa cosa (in decimale) che differenza fa?

duonovembre
28-10-2007, 13:16
che argomento trattato dal corso e che il prof ha dato un esercizio sul risparmio di memoria con i bit-field (risparmio che lui stesso ha ammesso essere praticamente inutile al 99% dei casi e che crea solo operazioni inutili in + ma che cmq devo imparare):D

oregon
28-10-2007, 13:22
S ... va bene ... ma cosa c'entra con l'input?

Intendo ... l'uso di bit field ti permette di risparmiare spazio (in determinate condizioni) ... ma l'input non deve essere necessariamente in binario per ottenere il risparmio ...

Non so se mi spiego ... l'argomento bit field e il sistema di numerazione usato per l'input di dati in tali campi, non sono legati ...

duonovembre
28-10-2007, 13:40
posso dichiarare quindi una variabile bitfield di 3 bit e darle un valore numerico decimale?

a lezione avevo capito di no (ma ho seguito male xk ero senza occhiali e sui testi e sulle guide nn trovo esempi PRATICI)

Loading