C 多重嵌套 if 是否有简单处理方法
本帖最后由 ajfan 于 2017-7-8 18:23 编辑请教大牛关于C编程思路的
通过uart 接收到的6位字符串(前5位用于功能定义,第6位为参数,非固定),不同的组合定义了不同的指向功能,用普通的if 语句 先判断第一位,然后在判断语句里再嵌套5个if 确定最终的字符串(然后根据这个字符串指向对应的功能模块,第6位作为参数也一起送过去),问题来了,除了5重嵌套 if 语句外,是否有其他的方式可以进行优化的指向?用switch并将所有的组合放在case里将会有32 个选项,不怎么想用。 一次读一帧。if(buf=='a'&&buf=='0'...)即可 一次读一个字符只能老老实实来了 你写简单了,逻辑复杂了,单片机效率不一定高了 状态机........... lcw_swust 发表于 2017-7-8 19:39
状态机...........
是啊。只能状态机。否则靠if?自己把自己写晕了。我还有超时功能,不用状态机,搞个j8。 其实这种问题,是你定的协议问题,每个功能都用不一样的首字母,后面跟参数。
后面就是字符串分割 对比,另外单片机的最快的就是if了,不然你想判断用什么语句? 协议,帧头,命令字, 查表!将所有的组合变成一个表和对应的跳转地址,再用 memcmp 函数检查接收指令(根据需要指定长度),然后跳转 ... 本帖最后由 jiangxingyuan 于 2017-7-9 09:34 编辑
指针函数数组,
void (*fun[][][][])()={
f1,
f2.
……
};
收到数据后,(*fun)();就直接可以跳到要执行的函数了。
我自己用的话一般都是二维数组,三四维的没有用过。你可以试一下。 jiangxingyuan 发表于 2017-7-9 09:32
指针函数数组,
void (*fun[][][][])()={
f1,
效率咋样 很多时候是c代码简洁,但是单片机效率不高, ztrx 发表于 2017-7-9 09:43
效率咋样
没有实际测试过。本质就是收到数据,查出跳转地址,通过跳转地址跳到函数入口。如果资源不是很紧张的时候不必太在乎效率,毕境资源你不用,也是浪费了。关键是维护性要好点。太多的分支嵌套,代码长度,缩进,对日后维护不方便。 典型的状态机应用需求。 有一种东西叫 Paser,依 Paser 最后解析的结果再执行类似 9 与 10 楼的那种方式执行该处理的程序。
其中也有用到一些查表法,可以依需求较更方便的来增减传送命令与资料。
也比一般写的 if 及 case 执行的方式有异故顺序判断执行的时间影响也会较小些。
本帖最后由 zyqcome 于 2017-7-9 22:22 编辑
jiangxingyuan 发表于 2017-7-9 09:32
指针函数数组,
void (*fun[][][][])()={
f1,
见过这种用法,当时给我的感受是,我有没有学过c语言,有这么爽的跳转
-----添加
但没有这么多层
看来楼主没有学过编译原理 lswood 发表于 2017-7-10 09:26
看来楼主没有学过编译原理
还望前辈讲解一下{:handshake:} jiangxingyuan 发表于 2017-7-9 09:32
指针函数数组,
void (*fun[][][][])()={
f1,
好方法,赞一个! 用状态机{:smile:} 状态机很轻松 谁给个状态机实现该功能的简易框架? lcw_swust 发表于 2017-7-8 19:39
状态机...........
能详细说下状态机的实现吗? 解决多重if方法
do
{
if(条件1) { ....break; }
if(条件2) { ....break; }
if(条件3) { ....break; }
...
}while(0); 建议查表,,,, switch(a)
{
case 1 :
{
break;
}
case 2:
{
break;
}
default:
{
break;
}
} 我一直是多个if,没出过问题 嗯,建立一个特征字符串和处理函数指针的数组,然后,处理只需要一个for即可。效率不怎么好,但是方便维护。可读性也非常不错。
页:
[1]