Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 16
  1. #1

    bit-field

    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


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

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    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.

  3. #3
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320

    Moderazione

    Il linguaggio: obbligatorio anche nel titolo!


    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

  4. #4
    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

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    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.

  6. #6
    e come faccio ad assegnare valori in binario o cmq fare cio' ke serve al mio scopo?

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Non puoi assegnare valori in binario, ma non ti serve ...

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

  8. #8
    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)

  9. #9
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    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 ...

  10. #10
    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)

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.