ajfan 发表于 2017-7-8 18:22:26

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

本帖最后由 ajfan 于 2017-7-8 18:23 编辑

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

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

whatcanitbe 发表于 2017-7-8 18:40:41

一次读一帧。if(buf=='a'&&buf=='0'...)即可

whatcanitbe 发表于 2017-7-8 18:42:07

一次读一个字符只能老老实实来了

rengo 发表于 2017-7-8 18:58:09

你写简单了,逻辑复杂了,单片机效率不一定高了

lcw_swust 发表于 2017-7-8 19:39:23

状态机...........

wye11083 发表于 2017-7-8 21:26:29

lcw_swust 发表于 2017-7-8 19:39
状态机...........

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

snail_dongbin 发表于 2017-7-8 21:44:53

其实这种问题,是你定的协议问题,每个功能都用不一样的首字母,后面跟参数。
后面就是字符串分割 对比,另外单片机的最快的就是if了,不然你想判断用什么语句?

Excellence 发表于 2017-7-8 21:53:53

协议,帧头,命令字,

chunjiu 发表于 2017-7-8 21:57:19

查表!将所有的组合变成一个表和对应的跳转地址,再用 memcmp 函数检查接收指令(根据需要指定长度),然后跳转 ...

jiangxingyuan 发表于 2017-7-9 09:32:29

本帖最后由 jiangxingyuan 于 2017-7-9 09:34 编辑

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

ztrx 发表于 2017-7-9 09:43:56

jiangxingyuan 发表于 2017-7-9 09:32
指针函数数组,
void (*fun[][][][])()={
                                  f1,


效率咋样            

1a2b3c 发表于 2017-7-9 10:10:07

很多时候是c代码简洁,但是单片机效率不高,

jiangxingyuan 发表于 2017-7-9 10:29:43

ztrx 发表于 2017-7-9 09:43
效率咋样

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

chxaitz 发表于 2017-7-9 13:32:56

典型的状态机应用需求。

xyz543 发表于 2017-7-9 21:54:49

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

zyqcome 发表于 2017-7-9 22:20:02

本帖最后由 zyqcome 于 2017-7-9 22:22 编辑

jiangxingyuan 发表于 2017-7-9 09:32
指针函数数组,
void (*fun[][][][])()={
                                  f1,


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

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

lswood 发表于 2017-7-10 09:26:06

看来楼主没有学过编译原理

WM_CH 发表于 2017-7-10 10:42:25

lswood 发表于 2017-7-10 09:26
看来楼主没有学过编译原理

还望前辈讲解一下{:handshake:}

xiaomu 发表于 2017-7-10 10:56:34

jiangxingyuan 发表于 2017-7-9 09:32
指针函数数组,
void (*fun[][][][])()={
                                  f1,


好方法,赞一个!

zhuozz 发表于 2017-7-10 11:02:56

用状态机{:smile:}

longwu537 发表于 2017-7-10 11:45:22

状态机很轻松

gujiamao_love 发表于 2017-7-10 11:58:58

谁给个状态机实现该功能的简易框架?

gsq19920418 发表于 2017-7-10 13:11:34

lcw_swust 发表于 2017-7-8 19:39
状态机...........

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

jangyouhua 发表于 2017-7-12 12:04:27

解决多重if方法
do
{
if(条件1) { ....break; }
if(条件2) { ....break; }
if(条件3) { ....break; }
...
}while(0);

zhugean 发表于 2017-7-12 12:09:33

建议查表,,,,

ldx24511 发表于 2017-7-12 16:00:47

switch(a)
{
case 1 :
{
break;
}
case 2:
{
break;
}
default:
{
break;
}
}

xqn2012 发表于 2017-7-13 22:40:29

我一直是多个if,没出过问题

zxq6 发表于 2017-7-14 15:20:32

嗯,建立一个特征字符串和处理函数指针的数组,然后,处理只需要一个for即可。效率不怎么好,但是方便维护。可读性也非常不错。
页: [1]
查看完整版本: C 多重嵌套 if 是否有简单处理方法