我必须根据像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位微控制器上运行
必须根据像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中的类型,而不是一些丑陋的自制类型.