summer2017 发表于 2019-9-18 13:03:43

求助,AVR Studio4.17+WinAVR-20100110, 多重if-else语句编译不正常!


如图中,黑色部分,直接被编译器忽略不处理。
2017年就碰到一样的情况了。当时时间紧直接改程序了。今天上论坛请教一下坛里的人,搞明白到底是哪里没设置好,还是编译软件本身有bug

t3486784401 发表于 2019-9-18 14:07:18

WinAVR 经常性的过度优化,建议检查 if() 里的 start_work_flash_add_enable 使用,是不是逻辑上为真什么的

summer2017 发表于 2019-9-18 16:05:21

t3486784401 发表于 2019-9-18 14:07
WinAVR 经常性的过度优化,建议检查 if() 里的 start_work_flash_add_enable 使用,是不是逻辑上为真什么的 ...

start_work_flash_add_enable逻辑上没问题的。 就是控制一个led的闪烁。 前几天还能看到led正常闪,   今天增加了很多其他功能的代码,再编译,发现led不闪了。确定上面黑色部分被编译器忽略了。2017年也碰到过一模一样的情况。也是多重if-else


网上也发现另一网友碰到超过4重if-else。会被编译器忽略的这种情况,但没看到他的解决方法,也可能他也还没解决这个问题

summer2017 发表于 2019-9-18 16:09:03

将上面所用到的所有变量定义为volatile, 也没解决此问题

kebaojun305 发表于 2019-9-18 16:35:52

这个变量是有符号数?看看反汇编

summer2017 发表于 2019-9-18 16:50:49

kebaojun305 发表于 2019-9-18 16:35
这个变量是有符号数?看看反汇编

谢谢回答!

volatile unsigned char start_work_flash_add_enable=0;//刚开始工作的前30秒闪灯用
参数都定义为volatile unsigned char ,但还是被忽略
优化等级也尝试更改过了。无效

rifjft 发表于 2019-9-18 19:17:39

程序不完整,有些变量是否在别的地方有修改也不清楚……

比较的是Blue*** , 而累加的是 Red*** 。没看到Blue*** 是否改变。那么假定Blue*** <40这个条件一直成立。而你的判断的标志位却受Blue*** 限制…… 这就是你的问题了

如果Blue*** 在程序中其它地方也是没修改的。 那么可以试试把Blue*** 变量也和Red*** 变量一样一起累加,这样 Red*** <40 就可以不成立。从而触发标志位,下一次就进入你说的那段被无视的程序中

mengtiantang 发表于 2019-9-18 19:34:26

我用feeling的单片机遇到类似。

summer2017 发表于 2019-9-18 21:30:31

rifjft 发表于 2019-9-18 19:17
程序不完整,有些变量是否在别的地方有修改也不清楚……

比较的是Blue*** , 而累加的是 Red*** 。没看到B ...

感谢你!
{:mad:}你说对了。 blue***应该是red***,      前两天还正常,后来加功能改来改去,可能错改了red***。   再加上 2017年就碰到过四重的if-else结构的错误, 所以自以为是认为是上次一样的编译错误了。根本没去想自己的代码上错误!



上次2017年碰到的问题:
原来写成这样的代码,执行不正确       
            if( Each_run_gap_pulse_value==0 )
                {
                  Forward_run_over_pulse_value++;
                }
                else
                {
                  Each_run_gap_pulse_value--;
                }

反而改成这样,才执行正确
            if( Each_run_gap_pulse_value==0 )
                {
                  Forward_run_over_pulse_value++;
                }
                //else
                if( Each_run_gap_pulse_value>0 )
                {
                  Each_run_gap_pulse_value--;
                }

无符号数,等于0和大于0,是互斥的。 用if-else居然执行得到不正确结果

rifjft 发表于 2019-9-18 21:48:35

{:lol:}火眼金睛,直接定位问题核心{:victory:}

if( Each_run_gap_pulse_value>0 )
{
   Each_run_gap_pulse_value--;
}
else
{
   Forward_run_over_pulse_value++;
}

这样行不行?

summer2017 发表于 2019-9-18 23:56:45

rifjft 发表于 2019-9-18 21:48
火眼金睛,直接定位问题核心

if( Each_run_gap_pulse_value>0 )


好像跟我原来这个没区别吧??   
if( Each_run_gap_pulse_value==0 )
                {
                  Forward_run_over_pulse_value++;
                }
                else
                {
                  Each_run_gap_pulse_value--;
                }

原来这个是不能正常工作的

summer2017 发表于 2019-9-19 00:07:32

summer2017 发表于 2019-9-18 21:30
感谢你!
你说对了。 blue***应该是red***,      前两天还正常,后来加功能改来改去,可能错改 ...

原因找到了,原来是一个模式, 灯光正常闪烁。这两天再增加两个模式, 新增的两个模式代码是从原来那个正常的模式改过来的。   mode==2这个模式的灯光改得不彻底。造成辨别blue***,改变的是red***.   粗心啊

qwe2231695 发表于 2019-9-19 01:10:59

代码没有注释,容易绕晕

Maurice 发表于 2019-9-19 08:35:00

我用ICCAVR的时候,不知道哪个版本,注释没去掉,还把注释部分的给编译了

xjjiang 发表于 2019-9-19 09:44:36

已经有好些年没有用AVR了,快10年了,挺回忆刚出来那段时光的

summer2017 发表于 2019-9-19 10:59:29

Maurice 发表于 2019-9-19 08:35
我用ICCAVR的时候,不知道哪个版本,注释没去掉,还把注释部分的给编译了

{:sweat:}
我喜欢在{} 符号后面这样注释,方便查看 { //1
                                                                      {//2
                                                                        。。。。。。
                                                                      }//2
                                                               } //1

难道也是注释搞的鬼?

summer2017 发表于 2019-9-19 11:03:30

xjjiang 发表于 2019-9-19 09:44
已经有好些年没有用AVR了,快10年了,挺回忆刚出来那段时光的

前10年选择没现在多。 好多人都用过avr pic

Maurice 发表于 2019-9-19 13:19:37

summer2017 发表于 2019-9-19 10:59
我喜欢在{} 符号后面这样注释,方便查看 { //1
                                       ...

记得不是行注释,是段注释出的问题

rifjft 发表于 2019-9-19 15:31:17

summer2017 发表于 2019-9-18 23:56
好像跟我原来这个没区别吧??   
if( Each_run_gap_pulse_value==0 )
                {


这类逻辑判断,直接测试就能确认。 接几个LED做状态指示就能直观……{:lol:}

而出问题的,多半是判断的条件或者次序没弄好……毕竟人的思维与编译器的识别是有区别的

zly_1980 发表于 2019-9-20 14:59:16

看到这里是不是觉得编译器很牛X?{:lol:}
页: [1]
查看完整版本: 求助,AVR Studio4.17+WinAVR-20100110, 多重if-else语句编译不正常!