搜索
bottom↓
回复: 27

C 多重嵌套 if 是否有简单处理方法

[复制链接]

出340入0汤圆

发表于 2017-7-8 18:22:26 | 显示全部楼层 |阅读模式
本帖最后由 ajfan 于 2017-7-8 18:23 编辑

请教大牛关于C编程思路的

通过uart 接收到的6位字符串(前5位用于功能定义,第6位为参数,非固定),不同的组合定义了不同的指向功能,用普通的if 语句 先判断第一位,然后在判断语句里再嵌套5个if 确定最终的字符串(然后根据这个字符串指向对应的功能模块,第6位作为参数也一起送过去),问题来了,除了5重嵌套 if 语句外,是否有其他的方式可以进行优化的指向?用switch并将所有的组合放在case里将会有32 个选项,不怎么想用。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出100入85汤圆

发表于 2017-7-8 18:40:41 来自手机 | 显示全部楼层
一次读一帧。if(buf[0]=='a'&&buf[1]=='0'...)即可

出100入85汤圆

发表于 2017-7-8 18:42:07 来自手机 | 显示全部楼层
一次读一个字符只能老老实实来了

出0入0汤圆

发表于 2017-7-8 18:58:09 | 显示全部楼层
你写简单了,逻辑复杂了,单片机效率不一定高了

出0入0汤圆

发表于 2017-7-8 19:39:23 | 显示全部楼层
状态机...........

出0入442汤圆

发表于 2017-7-8 21:26:29 来自手机 | 显示全部楼层
lcw_swust 发表于 2017-7-8 19:39
状态机...........

是啊。只能状态机。否则靠if?自己把自己写晕了。我还有超时功能,不用状态机,搞个j8。

出0入0汤圆

发表于 2017-7-8 21:44:53 | 显示全部楼层
其实这种问题,是你定的协议问题,每个功能都用不一样的首字母,后面跟参数。
后面就是字符串分割 对比,另外单片机的最快的就是if了,不然你想判断用什么语句?

出0入0汤圆

发表于 2017-7-8 21:53:53 来自手机 | 显示全部楼层
协议,帧头,命令字,

出280入168汤圆

发表于 2017-7-8 21:57:19 | 显示全部楼层
查表!将所有的组合变成一个表和对应的跳转地址,再用 memcmp 函数检查接收指令(根据需要指定长度),然后跳转 ...

出0入0汤圆

发表于 2017-7-9 09:32:29 | 显示全部楼层
本帖最后由 jiangxingyuan 于 2017-7-9 09:34 编辑

指针函数数组,
void (*fun[][][][])()={
                                  f1,
                                  f2.
                                  ……
                                };
收到数据后,(*fun[a][c][d])();就直接可以跳到要执行的函数了。
我自己用的话一般都是二维数组,三四维的没有用过。你可以试一下。

出0入4汤圆

发表于 2017-7-9 09:43:56 | 显示全部楼层
jiangxingyuan 发表于 2017-7-9 09:32
指针函数数组,
void (*fun[][][][])()={
                                  f1,

效率咋样            

出0入475汤圆

发表于 2017-7-9 10:10:07 来自手机 | 显示全部楼层
很多时候是c代码简洁,但是单片机效率不高,

出0入0汤圆

发表于 2017-7-9 10:29:43 | 显示全部楼层

没有实际测试过。本质就是收到数据,查出跳转地址,通过跳转地址跳到函数入口。如果资源不是很紧张的时候不必太在乎效率,毕境资源你不用,也是浪费了。关键是维护性要好点。太多的分支嵌套,代码长度,缩进,对日后维护不方便。

出0入0汤圆

发表于 2017-7-9 13:32:56 来自手机 | 显示全部楼层
典型的状态机应用需求。

出0入34汤圆

发表于 2017-7-9 21:54:49 | 显示全部楼层
有一种东西叫 Paser,依 Paser 最后解析的结果再执行类似 9 与 10 楼的那种方式执行该处理的程序。
其中也有用到一些查表法,可以依需求较更方便的来增减传送命令与资料。
也比一般写的 if 及 case 执行的方式有异故顺序判断执行的时间影响也会较小些。

出0入0汤圆

发表于 2017-7-9 22:20:02 来自手机 | 显示全部楼层
本帖最后由 zyqcome 于 2017-7-9 22:22 编辑
jiangxingyuan 发表于 2017-7-9 09:32
指针函数数组,
void (*fun[][][][])()={
                                  f1,


见过这种用法,当时给我的感受是,我有没有学过c语言,有这么爽的跳转

-----添加
但没有这么多层

出0入25汤圆

发表于 2017-7-10 09:26:06 来自手机 | 显示全部楼层
看来楼主没有学过编译原理

出0入0汤圆

发表于 2017-7-10 10:42:25 | 显示全部楼层
lswood 发表于 2017-7-10 09:26
看来楼主没有学过编译原理

还望前辈讲解一下

出0入0汤圆

发表于 2017-7-10 10:56:34 | 显示全部楼层
jiangxingyuan 发表于 2017-7-9 09:32
指针函数数组,
void (*fun[][][][])()={
                                  f1,

好方法,赞一个!

出0入0汤圆

发表于 2017-7-10 11:02:56 | 显示全部楼层
用状态机

出0入0汤圆

发表于 2017-7-10 11:45:22 来自手机 | 显示全部楼层
状态机很轻松

出0入0汤圆

发表于 2017-7-10 11:58:58 | 显示全部楼层
谁给个状态机实现该功能的简易框架?

出0入0汤圆

发表于 2017-7-10 13:11:34 | 显示全部楼层

能详细说下状态机的实现吗?

出0入0汤圆

发表于 2017-7-12 12:04:27 | 显示全部楼层
解决多重if方法
do
{
  if(条件1) { ....break; }
if(条件2) { ....break; }
if(条件3) { ....break; }
...
}while(0);

出0入0汤圆

发表于 2017-7-12 12:09:33 | 显示全部楼层
建议查表,,,,

出0入0汤圆

发表于 2017-7-12 16:00:47 | 显示全部楼层
switch(a)
{
case 1 :
{
break;
}
case 2:
{
break;
}
default:
{
break;
}
}

出0入0汤圆

发表于 2017-7-13 22:40:29 | 显示全部楼层
我一直是多个if,没出过问题

出0入22汤圆

发表于 2017-7-14 15:20:32 来自手机 | 显示全部楼层
嗯,建立一个特征字符串和处理函数指针的数组,然后,处理只需要一个for即可。效率不怎么好,但是方便维护。可读性也非常不错。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-19 17:22

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表