OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5144|回复: 28

if 嵌套里 if 问题:几个if是并列关系,但是如果第一个if判断为假,后面应该继续判断剩下的if,但是它跳过了后面的if判断

[复制链接]

5

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
77
金钱
77
注册时间
2017-11-7
在线时间
10 小时
发表于 2017-11-28 16:32:09 | 显示全部楼层 |阅读模式
1金钱
如图所示,在ABCD( )这个函数的最后面有这样一个if嵌套语句:
一个大的if里面嵌套了8个if判断语句,按理说,这8个语句是并列关系,谁也碍不着谁

问题:当if(access1_flag)为真时,后面的7个判断不论是真是假,都会一个一个的去判断执行
如果if(access1_flag)为假时,后面的7个判断不论是真是假,都会直接跳过(按理应该一个一个去判断,不跳过啊)
(单步执行里看见它们总共就执行了两句,算是跳过)


我想了两天都没想出来问题所在,因为access1_flag和别的7个flag没啥特殊区别啊
请大神帮帮忙看一下啊

(程序大多已经删减,方便观看,除了调试必要的部分没删

if嵌套

if嵌套

函数ABCD( )里的 if 嵌套里 if 不执行问题.zip

3.76 MB, 下载次数: 227

if嵌套的工程文件

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

5

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
77
金钱
77
注册时间
2017-11-7
在线时间
10 小时
 楼主| 发表于 2017-11-28 16:36:26 | 显示全部楼层
这8个flag在初始化的时候已经赋值为0 了,所以不是没赋值的原因哦
回复

使用道具 举报

0

主题

207

帖子

0

精华

高级会员

Rank: 4

积分
959
金钱
959
注册时间
2017-5-27
在线时间
108 小时
发表于 2017-11-28 16:38:53 | 显示全部楼层
你这哪里有嵌套 所有的标志都判断了呀
回复

使用道具 举报

0

主题

207

帖子

0

精华

高级会员

Rank: 4

积分
959
金钱
959
注册时间
2017-5-27
在线时间
108 小时
发表于 2017-11-28 16:39:18 | 显示全部楼层
lanlzp 发表于 2017-11-28 16:38
你这哪里有嵌套 所有的标志都判断了呀

你应该查看你的标志位
回复

使用道具 举报

0

主题

207

帖子

0

精华

高级会员

Rank: 4

积分
959
金钱
959
注册时间
2017-5-27
在线时间
108 小时
发表于 2017-11-28 16:48:04 | 显示全部楼层
lanlzp 发表于 2017-11-28 16:39
你应该查看你的标志位

而且你引用其它位置的标志位变量,有extern声明变量么?
回复

使用道具 举报

115

主题

548

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2099
金钱
2099
注册时间
2013-11-27
在线时间
518 小时
发表于 2017-11-28 16:48:51 | 显示全部楼层
if(access1_flag)
知道这是判断什么吗?

只能判断出是否非零 哪里 能判断12345678 来
语法都不懂
回复

使用道具 举报

2

主题

38

帖子

0

精华

初级会员

Rank: 2

积分
87
金钱
87
注册时间
2015-7-23
在线时间
9 小时
发表于 2017-11-28 16:56:02 | 显示全部楼层
肯定会一个一个判断
回复

使用道具 举报

0

主题

96

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
297
金钱
297
注册时间
2017-10-12
在线时间
83 小时
发表于 2017-11-28 18:12:41 | 显示全部楼层
有没有开编译优化?开编译优化的话,如果只在中断内修改而函数本身无修改的变量,需要加volatile关键字。
回复

使用道具 举报

17

主题

354

帖子

0

精华

高级会员

Rank: 4

积分
797
金钱
797
注册时间
2017-5-21
在线时间
340 小时
发表于 2017-11-28 18:17:33 来自手机 | 显示全部楼层
不如把if改成switch
回复

使用道具 举报

70

主题

6763

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13125
金钱
13125
注册时间
2012-11-26
在线时间
3814 小时
发表于 2017-11-28 18:31:57 | 显示全部楼层
自己看看你各个变量都是啥值吧
回复

使用道具 举报

4

主题

346

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3657
金钱
3657
注册时间
2016-2-21
在线时间
542 小时
发表于 2017-11-28 19:44:49 | 显示全部楼层
debug进去看值对不对先,值没问题再说别的
回复

使用道具 举报

24

主题

695

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1666
金钱
1666
注册时间
2016-4-29
在线时间
266 小时
发表于 2017-11-28 20:50:11 | 显示全部楼层
看值是多少,值肯定是0
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2017-11-29 00:35:40 | 显示全部楼层
仿真找问题
回复

使用道具 举报

5

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
77
金钱
77
注册时间
2017-11-7
在线时间
10 小时
 楼主| 发表于 2017-11-29 11:18:47 | 显示全部楼层
它们的值只可能是0或者1,不存在值的问题,在debug仿真里面看过了,值全程都是对的,不存在值的问题。问题只有一个,当if(access1_flag)为假时,就是不进后面所有的if判断了(还有我对if判断很了解,就是判断括号里是真还是假(我这里是为1还是为0),我什么时候说过判断它是否等于1,2,3,4,5,6,7,8了,自己看不清题目的,就请不要瞎说)
回复

使用道具 举报

5

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
77
金钱
77
注册时间
2017-11-7
在线时间
10 小时
 楼主| 发表于 2017-11-29 11:38:13 | 显示全部楼层
longfeixue 发表于 2017-11-28 16:56
肯定会一个一个判断

然而它就是不一个一个执行呀,debug仿真调试里面单步调试,发现它是真的直接跳过了
回复

使用道具 举报

5

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
77
金钱
77
注册时间
2017-11-7
在线时间
10 小时
 楼主| 发表于 2017-11-29 11:41:14 | 显示全部楼层

debug仿真调试过了,客服也找了,实在是找不出来才来这里问的呀
回复

使用道具 举报

5

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
77
金钱
77
注册时间
2017-11-7
在线时间
10 小时
 楼主| 发表于 2017-11-29 11:43:09 | 显示全部楼层
d1z1y2 发表于 2017-11-28 20:50
看值是多少,值肯定是0

不进行if判断,就算是值为0,它也得给我进行if判断,然后判断为假,该if结束,判断下一个if吧,问题是,它只判断第一个,第一个为假,后面的7个if都不判断了
回复

使用道具 举报

5

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
77
金钱
77
注册时间
2017-11-7
在线时间
10 小时
 楼主| 发表于 2017-11-29 11:43:45 | 显示全部楼层
shikihane 发表于 2017-11-28 19:44
debug进去看值对不对先,值没问题再说别的

值没有任何的问题啊,debug仿真调试过了,值全程都是正确的
回复

使用道具 举报

5

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
77
金钱
77
注册时间
2017-11-7
在线时间
10 小时
 楼主| 发表于 2017-11-29 11:44:56 | 显示全部楼层
cxf0153 发表于 2017-11-28 18:12
有没有开编译优化?开编译优化的话,如果只在中断内修改而函数本身无修改的变量,需要加volatile关键字。

不在中断里面修改值啊,是根据屏幕传过来的数值,经过判断后,再修改的啊
回复

使用道具 举报

5

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
77
金钱
77
注册时间
2017-11-7
在线时间
10 小时
 楼主| 发表于 2017-11-29 11:46:42 | 显示全部楼层
wmh19910511 发表于 2017-11-28 16:48
if(access1_flag)
知道这是判断什么吗?

我什么时候让它判断是否为1,2,3,4,5,6,7,8了,后面的注释//1表示通道1,//2表示通道2,//3表示通道3,//4表示通道4,//5表示通道5,//6表示通道6,//7表示通道7,//8表示通道8
回复

使用道具 举报

5

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
77
金钱
77
注册时间
2017-11-7
在线时间
10 小时
 楼主| 发表于 2017-11-29 11:47:26 | 显示全部楼层
lanlzp 发表于 2017-11-28 16:48
而且你引用其它位置的标志位变量,有extern声明变量么?

有啊,头文件也include了(不然编译岂不是会报错?)
回复

使用道具 举报

5

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
77
金钱
77
注册时间
2017-11-7
在线时间
10 小时
 楼主| 发表于 2017-11-29 11:48:19 | 显示全部楼层
lanlzp 发表于 2017-11-28 16:39
你应该查看你的标志位

DEBUG仿真调试看过了,标志位全程都是正确的,改是什么值就是什么值
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2017-11-30 01:01:31 | 显示全部楼层
heheda 发表于 2017-11-29 11:18
它们的值只可能是0或者1,不存在值的问题,在debug仿真里面看过了,值全程都是对的,不存在值的问题。问题 ...

如果值正确,那么if判断肯定不会出错的,仔细找
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

9

主题

87

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1435
金钱
1435
注册时间
2015-5-19
在线时间
132 小时
发表于 2017-11-30 08:33:11 | 显示全部楼层
有几个问题,不知道对不对,可以自己改改看看,如图片:第一,图片1中头文件#include "TEST1.h",为什么是大写,不是#include "test1.h",我改后编译,两个都能编译通过,不知道是否有影响;
第二,图片2和图片3,main函数是主函数,对于数组comBuffer[],和变量access1_flag,access2_flag...access8_flag的定义,一般在主函数中定义,如果不是在主函数中,一般有extern声明,你这里是在test1中定义的,没有找到这个声明,但编译通过了,布置是否有影响;
第三,图片4和图片5里面都有这几个if的判断,不知道这里判断时是不是也是你所描述的情况,如果也是那样的话,那应该不是if语法的问题,肯定程序哪里有问题;如果这里是正常的,就ABCD()判断那里出问题,那就从这几个没问题代码的后面直到ABCD()函数,查看代码,如果确信没问题,重建工程再试试吧。

头文件

头文件

变量定义

变量定义

变量定义

变量定义

判断

判断

判断

判断
回复

使用道具 举报

6

主题

279

帖子

0

精华

高级会员

Rank: 4

积分
750
金钱
750
注册时间
2015-3-27
在线时间
98 小时
发表于 2017-11-30 11:24:43 | 显示全部楼层
题主这工程这么大,还是删减过的啊。。ABCD()还需要按键才能进入
你语句的if语法是没有问题的,你自己用打打印函数把if判断的值打印出来就能调试
回复

使用道具 举报

6

主题

279

帖子

0

精华

高级会员

Rank: 4

积分
750
金钱
750
注册时间
2015-3-27
在线时间
98 小时
发表于 2017-11-30 11:26:44 | 显示全部楼层
if后面要加else确定是不是不判断了,还是值不对,这个自己可以看出来了
回复

使用道具 举报

5

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
77
金钱
77
注册时间
2017-11-7
在线时间
10 小时
 楼主| 发表于 2017-12-23 13:30:44 | 显示全部楼层
胖子阳 发表于 2017-11-30 08:33
有几个问题,不知道对不对,可以自己改改看看,如图片:第一,图片1中头文件#include "TEST1.h",为什么是 ...

工程比较大,有些变量是在其他.c里面定义的,然后在global_variable.h里用extern声明的
回复

使用道具 举报

5

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
77
金钱
77
注册时间
2017-11-7
在线时间
10 小时
 楼主| 发表于 2017-12-23 13:34:23 | 显示全部楼层
胖子阳 发表于 2017-11-30 08:33
有几个问题,不知道对不对,可以自己改改看看,如图片:第一,图片1中头文件#include "TEST1.h",为什么是 ...

其余地方的if没有问题,而且我发现,如果上电后第一次运行的时候,if(access1_flag)判断为真,则后续if(access1_flag)不管是真是假,都能运行正确,如果第一次运行的时候,if(access1_flag)为假,则后续if(access1_flag)不管是真是假,都不能正常运行,感觉很奇怪的呢
回复

使用道具 举报

4

主题

349

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1046
金钱
1046
注册时间
2017-5-19
在线时间
335 小时
发表于 2017-12-23 13:45:37 | 显示全部楼层
heheda 发表于 2017-12-23 13:34
其余地方的if没有问题,而且我发现,如果上电后第一次运行的时候,if(access1_flag)判断为真,则后续if ...

试试关掉编译器的优化
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-16 00:35

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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