Как лучше всего установить значения битового поля с помощью циклов? - PullRequest
1 голос
/ 06 мая 2020

Это простой код; Я использую этот фрагмент кода в своем проекте, и он работает нормально.

Мой вопрос, лучше ли это или иначе Как лучше всего установить битовые поля с помощью циклов в C?

#define NUM_OF_MAX_SENSOR 10

typedef  float SENSOR_VAL ;

typedef struct
{
  unsigned char bit0:1;
  unsigned char bit1:1;
  unsigned char bit2:1;
  unsigned char bit3:1;
  unsigned char bit4:1;
  unsigned char bit5:1;
  unsigned char bit6:1;
  unsigned char bit7:1; 
}BYTE_FIELD;

typedef struct
{
   BYTE_FIELD funP1;    
   BYTE_FIELD funP2;

}LOG_DATA;

LOG_DATA xlog;

typedef struct
{
   unsigned char ok:1;
   unsigned char open:1;
   unsigned char shrt:1;
   unsigned char unused:5;  
}SENSOR_FLAGS;

typedef struct
{
   SENSOR_FLAGS flag;
   SENSOR_VAL   val;
}SENSOR_DATA;

typedef union
{
   SENSOR_DATA   sensor[NUM_OF_MAX_SENSOR];
   unsigned char buff[sizeof(SENSOR_DATA) * NUM_OF_MAX_SENSOR]; 
}SENSOR;

SENSOR sensor;

Это структуры, которые я использовал, и это максимальное количество деталей, которые я могу предоставить.

void UpdateLogData()
{
    int i = 0;
    unsigned char *funPAddr =(unsigned char *) &xlog.funP1;

    for(i=0;i<8;i++) 
          *(funPAddr)  |= sensor.sensor[i].flag.ok << i;

    printf("0x%x",*(funPAddr));
}

//main
int main()
 {
    sensor.sensor[0].flag.ok = 1;

    sensor.sensor[4].flag.ok = 1;
    sensor.sensor[5].flag.ok = 1;
    sensor.sensor[6].flag.ok = 1;
    sensor.sensor[7].flag.ok = 1;

    UpdateLogData();
 }
...