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