XC16编译器下楼层锁在线判断的if条件逻辑问题排查
哦,我一眼就看出你代码里的问题了——你写的条件判断逻辑犯了一个常见的C语言枚举值比较错误,这就是为什么两个锁明明返回eStatusLockIndeterminate却进不了操作代码的原因。
原代码的核心错误
你把多个枚举值用||放在==的右边,比如lockState == (eStatusLockIndeterminate || eStatusLockEngaged ...),这在C语言里完全不符合逻辑:
- 枚举值本质是整数类型,
eStatusLockIndeterminate和eStatusLockEngaged都是非0值,它们的逻辑或运算结果是1(布尔真)。 - 你相当于在判断
lockState == 1,但你的枚举值eStatusLockIndeterminate肯定不是1,所以这个条件永远为假,自然不会执行后续操作。
正确的两种实现方案
方案1:直接排除离线状态(推荐,匹配你“在线即不返回eStatusLockUnknown”的需求)
既然在线状态的定义就是不是eStatusLockUnknown,那直接判断两个锁的状态都不等于这个值即可,代码简洁且不易出错:
// 替换eTailFloorLock为你实际的第二个楼层锁枚举值 if ((sLockStatus[eHeadFloorLock].lockState != eStatusLockUnknown) && (sLockStatus[eTailFloorLock].lockState != eStatusLockUnknown)) { // 这里写你要执行的操作代码 }
方案2:明确匹配所有在线状态值
如果你需要严格限定在线状态是eStatusLockIndeterminate、eStatusLockEngaged等特定枚举值,建议用辅助宏封装判断逻辑,方便后续维护:
// 定义宏:判断单个锁是否处于在线状态 #define IS_LOCK_ONLINE(lock_state) \ ((lock_state == eStatusLockIndeterminate) || \ (lock_state == eStatusLockEngaged) || \ (lock_state == eStatusLockStowed) || \ (lock_state == eStatusLockFullyEngaged)) // 判断两个锁都在线 if (IS_LOCK_ONLINE(sLockStatus[eHeadFloorLock].lockState) && IS_LOCK_ONLINE(sLockStatus[eTailFloorLock].lockState)) { // 执行操作代码 }
用宏的好处是:如果以后在线状态的枚举值有新增或修改,你只需要修改宏的定义,不用在代码里到处找判断条件修改,减少出错概率。
内容的提问来源于stack exchange,提问作者kward
相关产品推荐
相关产品推荐

