在 C 中使用 table 而不是 switch case
use a table instead of switch case in C
在这种情况下,如何用 table 替换 switch case?
typedef enum
{ DIV_1 = 1,
DIV_2,
DIV_4 = 4,
DIV_8 = 8,
DIV_16 = 16
} eDiv_t;
eDiv_t Division;
uint32_t dividerValue;
switch (Division)
{
case DIV_1:
dividerValue = RCC_DIV_1;
break;
case DIV_2:
dividerValue = RCC_DIV_2;
break;
case DIV_4:
dividerValue = RCC_DIV_4;
break;
case DIV_8:
dividerValue = RCC_DIV_8;
break;
case DIV_16:
dividerValue = RCC_DIV_16;
break;
default:
dividerValue = RCC_DIV_1;
break;
}
我不知道如何将枚举变量影响到数组并使用它代替 switch case
您可以将您的枚举定义为连续的整数值并使用此枚举索引您的数组:
typedef enum
{ DIV_1 = 0,
DIV_2,
DIV_4,
DIV_8,
DIV_16,
NB_DIV
} eDiv_t;
unsigned int dividerValue[NB_DIV] = {RCC_DIV1, RCC_DIV2, ..., RCC_DIV16};
在这种特定情况下,由于 eDiv_t
在别处使用而无法更改,因此可以按以下方式查找 table:
RCC_t eDiv_to_RCC (eDiv_t ediv)
{
static const RCC_t lookup [16+1] =
{
[DIV_1] = RCC_DIV1,
[DIV_2] = RCC_DIV2,
[DIV_4] = RCC_DIV4,
[DIV_8] = RCC_DIV8,
[DIV_16] = RCC_DIV16,
};
return lookup[ediv]; // returns 0 if invalid input
}
这非常快,但会消耗 17 * sizeof(RCC_t)
,我认为这是另一个枚举,可能有 8 到 32 位大。不是那么大,但这是超过 .rodata 大小优化的执行速度。另一方面,实际代码将比 switch 版本花费更少 space。
在这种情况下,如何用 table 替换 switch case?
typedef enum
{ DIV_1 = 1,
DIV_2,
DIV_4 = 4,
DIV_8 = 8,
DIV_16 = 16
} eDiv_t;
eDiv_t Division;
uint32_t dividerValue;
switch (Division)
{
case DIV_1:
dividerValue = RCC_DIV_1;
break;
case DIV_2:
dividerValue = RCC_DIV_2;
break;
case DIV_4:
dividerValue = RCC_DIV_4;
break;
case DIV_8:
dividerValue = RCC_DIV_8;
break;
case DIV_16:
dividerValue = RCC_DIV_16;
break;
default:
dividerValue = RCC_DIV_1;
break;
}
我不知道如何将枚举变量影响到数组并使用它代替 switch case
您可以将您的枚举定义为连续的整数值并使用此枚举索引您的数组:
typedef enum
{ DIV_1 = 0,
DIV_2,
DIV_4,
DIV_8,
DIV_16,
NB_DIV
} eDiv_t;
unsigned int dividerValue[NB_DIV] = {RCC_DIV1, RCC_DIV2, ..., RCC_DIV16};
在这种特定情况下,由于 eDiv_t
在别处使用而无法更改,因此可以按以下方式查找 table:
RCC_t eDiv_to_RCC (eDiv_t ediv)
{
static const RCC_t lookup [16+1] =
{
[DIV_1] = RCC_DIV1,
[DIV_2] = RCC_DIV2,
[DIV_4] = RCC_DIV4,
[DIV_8] = RCC_DIV8,
[DIV_16] = RCC_DIV16,
};
return lookup[ediv]; // returns 0 if invalid input
}
这非常快,但会消耗 17 * sizeof(RCC_t)
,我认为这是另一个枚举,可能有 8 到 32 位大。不是那么大,但这是超过 .rodata 大小优化的执行速度。另一方面,实际代码将比 switch 版本花费更少 space。