如何减少C语言代码中的if语句?FlipperZero自动点击器卡顿优化求助
FlipperZero自动点击应用卡顿问题优化
问题背景
用C语言开发FlipperZero自动点击应用时,切换selected变量出现严重卡顿,现有代码通过大量独立if语句映射selected到对应的按键Key_code,同时不清楚如何利用已定义字母变量的.h文件。
现有代码
if (selected == 0) { Key_code = 0x04; } if (selected == 1) { Key_code = 0x05; } if (selected == 2) { Key_code = 0x06; } if (selected == 3) { Key_code = 0x07; } if (selected == 4) { Key_code = 0x08; } if (selected == 5) { Key_code = 0x09; } if (selected == 6) { Key_code = 0x0a; } if (selected == 7) { Key_code = 0x0b; } if (selected == 8) { Key_code = 0x0c; } if (selected == 9) { Key_code = 0x0d; } if (selected == 10) { Key_code = 0x0e; } if (selected == 11) { Key_code = 0x0f; } if (selected == 12) { Key_code = 0x10; } if (selected == 13) { Key_code = 0x11; } if (selected == 14) { Key_code = 0x12; } if (selected == 15) { Key_code = 0x13; } if (selected == 16) { Key_code = 0x14; } if (selected == 17) { Key_code = 0x15; } if (selected == 18) { Key_code = 0x16; } if (selected == 19) { Key_code = 0x17; } if (selected == 20) { Key_code = 0x18; } if (selected == 21) { Key_code = 0x19; } if (selected == 22) { Key_code = 0x1a; } if (selected == 23) { Key_code = 0x1b; } if (selected == 24) { Key_code = 0x1c; } if (selected == 25) { Key_code = 0x1d; }
优化方案
1. 直接计算映射(最简洁)
观察到selected从0到25,对应的Key_code是从0x04到0x1d,刚好是selected + 0x04的关系。直接用计算替代所有if判断,大幅减少代码执行时间:
// 先判断selected是否在有效范围内,避免非法值导致错误 if (selected >= 0 && selected <= 25) { Key_code = 0x04 + selected; } else { // 可选:处理超出范围的情况,比如设置默认值 Key_code = 0x04; }
2. 使用数组映射(更灵活,适合后续扩展)
如果后续Key_code和selected的对应关系可能变化,用数组存储所有Key_code,通过索引直接取值:
// 定义按键码数组,顺序对应selected 0-25 const uint8_t key_codes[] = { 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d }; // 取值时先判断范围 if (selected >= 0 && selected < sizeof(key_codes)/sizeof(key_codes[0])) { Key_code = key_codes[selected]; } else { Key_code = 0x04; // 默认值 }
3. 结合.h文件的字母变量
假设你的.h文件中定义了类似这样的宏(比如对应字母A-Z的按键码):
// keys.h 中的内容示例 #define KEY_A 0x04 #define KEY_B 0x05 #define KEY_C 0x06 // ... 直到 KEY_Z 0x1d
可以直接在数组中使用这些宏,让代码更易读:
#include "keys.h" const uint8_t key_codes[] = { KEY_A, KEY_B, KEY_C, KEY_D, KEY_E, KEY_F, KEY_G, KEY_H, KEY_I, KEY_J, KEY_K, KEY_L, KEY_M, KEY_N, KEY_O, KEY_P, KEY_Q, KEY_R, KEY_S, KEY_T, KEY_U, KEY_V, KEY_W, KEY_X, KEY_Y, KEY_Z }; // 取值逻辑和之前一致 if (selected >= 0 && selected < sizeof(key_codes)/sizeof(key_codes[0])) { Key_code = key_codes[selected]; } else { Key_code = KEY_A; }
原代码卡顿原因
原代码中每个if语句都会被依次判断,即使已经找到匹配的selected值,后续的if仍然会执行。比如当selected=25时,要执行26次判断,这在资源有限的FlipperZero上会累积出明显的卡顿。优化后的代码只需要1次范围判断+1次计算/数组索引,执行效率大幅提升。
内容的提问来源于stack exchange,提问作者dumbdude101
相关产品推荐
相关产品推荐

