比if-else更好的解决方案呢?

Gre*_*ret -3 c embedded

我必须根据像83025(大于65535)这样的大数字的值来做一些事情.为此,我不能使用switch-case,因为它只使用最大值为255的整数参数.(或者至少这是我所知道的.但是我仍然尝试过编译但是switch-case不能正常工作. )

所以我想我会if-else if像下面这样制作一个梯子,但它看起来并不太优雅.

if      ((refnum == 32120) ||  
         (refnum == 32075))   {

else if  (refnum == 51036)    {

else if ((refnum == 61024) ||  
         (refnum == 61060))   {

else if ((refnum == 71030) ||  
         (refnum == 71048))   {

else if ((refnum == 72012) ||  
         (refnum == 72024) ||  
         (refnum == 72048))   {

else if ((refnum == 81025) ||  
         (refnum == 81050) ||  
         (refnum == 81100))   {

else if ((refnum == 82012) ||  
         (refnum == 82024) ||  
         (refnum == 82048) ||  
         (refnum == 82096))   {

else if ((refnum == 83050) ||  
         (refnum == 83100))   {
Run Code Online (Sandbox Code Playgroud)

你能否证实这是正确的做法?或者你有更好的主意吗?

附加信息:

  • refnum是一个32位无符号整数

  • 大数字来自字符串的中间strtol并将其转换为DWORD

  • 在每种情况下我必须做的事情是执行a strcpy然后return是某个值.

  • 代码嵌入并在16位微控制器上运行

Lun*_*din 7

必须根据像83025这样的大数字的价值来做一些事情

然后确保所涉及的所有变量都使用uint32_t.

为此,我不能使用switch-case,因为它只使用最大值为255的整数参数

这是一个误解,不确定你从哪里得到这个想法.该switch语句适用于所有整数常量表达式.switch语句本身没有数字限制.

(实际上,switch语句的控制表达式被隐式提升为type int,如果它恰好是一个较小的整数类型.)

所以我想我会在下面制作一个if-else if ladder,但它看起来并不太优雅.你能否证实这是正确的做法?或者你有更好的主意吗?

if-else将生成与相应交换机完全相同的机器代码.该开关可能会增加一点可读性,因此可能是一个更好的选择:

switch (refnum)
{
  case 32120: do_this(); break;
  case 61024: do_that(); break;
  ...
  default:    do_something();
}
Run Code Online (Sandbox Code Playgroud)

替代方案:

我注意到这些是按排序顺序的整数值.如果有很多值或需要快速查找,您也可以用二进制搜索替换整个事物.这可能会提供更快的代码,但也会增加复杂性.优选地,使用C标准bsearch().

但是,如果您希望最终实现的是返回指向字符串的指针,则此解决方案可能是理想的.然后,您可以将数字和字符串存储为键值对:

typedef struct
{
  uint32_t key;
  const char* str;
} thingie_t;

static const thingie_t things [] = 
{
  { 32120, "text string" },
  { 32075, "another text string" },
  ...
};
Run Code Online (Sandbox Code Playgroud)

大数字来自字符串的中间,strtol将其转换为DWORD

你为什么用签名号码?数据似乎没有签名.什么是DWORD?这是Windows编程中的一些臭类型,在嵌入式系统中绝对应该避免.使用stdint.h中的类型,而不是一些丑陋的自制类型.