簡體   English   中英

如何在 C 中的一組位字段標志上實現查找表?

[英]How to implement a lookup table on a set of bit-field flags in C?

我有一組使用位域的標志,根據用戶輸入,這些標志將被設置,程序應相應地響應並清除相應的請求,我當前的實現工作並達到預期目的,但是我承認我當前的方法不會是可擴展的,我相信必須有更好的方法來實現這一點,也許使用查找表,但我不確定如何這樣做。 任何幫助或建議都非常感謝。

typedef union{

    volatile uint32_t all_flags;                                
    
    struct{
    
        volatile bool flag_a                            : 1;
        volatile bool flag_b                            : 1;
        volatile bool flag_c                            : 1;        
    
    }type;              

} flags_t; 

flags_t foo;

void flags_set_thread(uint8_t val){

   if(val == 0x12){
      foo.type.flag_a = true;
   } 
   else if(val == 0x34){
      foo.type.flag_b = true;
   }
   else if(val == 0x56){
      foo.type.flag_c = true; 
   }

}

int main(){
   
   while(1){

     if(foo.type.flag_a){
       printf("Perform corresponding task to flag a and clear flag \n");
       foo.type.flag_a = false;  
     }
     else if(foo.type.flag_b){
      printf("Perform corresponding task to flag b and clear flag \n");
      foo.type.flag_b = false; 
     }
     else if(foo.type.flag_c){
      printf("Perform corresponding task to flag c and clear flag \n");
      foo.type.flag_c = false;
     }

   }

   return 0;

}

最初的問題本質上是,我如何創建一個查找表,我可以為每個標志分配和索引,以便不需要ifelse

干杯,

我不會使用位域。 讓編譯器為您創建查找表。 如果您分配 compile const 值,宏定義很好,因為它不會生成任何分支。

#define flag_a     (1U << 0)
#define flag_b     (1U << 1)
#define flag_c     (1U << 2)

#define SET_F(var, flag, val) ((val) ? ((var) |= (flag)) : ((var) &= (~(flag))))

volatile uint32_t flags;

void flags_set_thread(uint32_t val)
{

    switch(val)
    {
        case 0x12:
         SET_F(flags, flag_a, 1);
         break;
        case 0x34:
         SET_F(flags, flag_b, 1);
         break;
        case 56:
         SET_F(flags, flag_c, 1);
         break;
    }
}

int main(){
   
    while(1){
        switch(flags)
        {
            case flag_a:
             /* do something*/
             SET_F(flags, flag_a, 0);
             break;
            case flag_b:
             /* do something*/
             SET_F(flags, flag_b, 0);
             break;
            case flag_c:
             /* do something*/
             SET_F(flags, flag_c, 0);
             break;
        }
    }
}

https://godbolt.org/z/dvfo3a6oa

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM