You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何减少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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 05:47:09