[PIC®/AVR®/dsPIC®产品] if和else if 的神奇事项有人知道这是怎么回事吗?

[复制链接]
1889|14
 楼主| gaoyang9992006 发表于 2023-4-23 08:48 | 显示全部楼层 |阅读模式
本帖最后由 gaoyang9992006 于 2023-4-23 09:21 编辑

#技术资源# #每日话题# #申请原创#
最近我在倒腾玩,用12832配合AT89S52单片机研究底层的显示驱动写法。
比如给一个点坐标显示一个点。后来想着建立缓存空间,发现51的内存太小,放不下。
然后写了一个锯齿波测试,发现了多个分支如果不用else是会出现意想不到的BUG。
正确的写法如下
  1. for(i=0;i<128;i++)
  2.         {
  3.                 if(i<32)
  4.                 setPixel(i,i);
  5.                 else if(i<64)
  6.                 setPixel(i,63-i);
  7.                 else if(i<96)
  8.                 setPixel(i,i-64);        
  9.                 else if(i<128)
  10.                 setPixel(i,127-i);               
  11.         }

我发现删除了所有的else后就会出现问题了,显示的断断续续不完整的波。。
对应代码与图像如下
  1. //锯齿波
  2.         for(i=0;i<128;i++)
  3.         {
  4.                 if(i<32)
  5.                 setPixel(i,i);
  6.                 if(i<64)
  7.                 setPixel(i,63-i);
  8.                 if(i<96)
  9.                 setPixel(i,i-64);        
  10.                 if(i<128)
  11.                 setPixel(i,127-i);               
  12.         }



因此要准确使用else,避免多次执行代码。
总结:
当没有采用else的时候程序会通过每一个if判断多个条件是否满足,满足的都会执行对应代码。
例如:i==1
那么后面的四条语句其实都满足的,所以都会执行。
当增加了else,只执行满足判断条件的第一个,如果第一个if满足条件,else后面紧跟的if就不会判断了,更不会执行后面的语句了。如果if 不满足才会尝试后面的几个else,直到找到第一个满足条件的,执行后面的语句。
有时候脑子一糊涂啊,就容易理解错。
分享给大家。

为了更好的分享,再补充上显示正弦波的注意事项
  1. //锯齿波
  2. for(i=0;i<128;i++)
  3.         {
  4.                 if(i<32)
  5.                 setPixel(i,i);
  6.                 else if(i<64)
  7.                 setPixel(i,63-i);
  8.                 else if(i<96)
  9.                 setPixel(i,i-64);
  10.                 else if(i<128)
  11.                 setPixel(i,127-i);
  12.                 delay_ms(1);
  13.         }
  14.         
  15. //正弦波
  16. for(i=0;i<128;i++)
  17.         {
  18.                 y=16.0+sin(i/32.0*3.14)*16.0;
  19.                 j=(unsigned int)(y);
  20.                 setPixel(i,j);
  21.                 delay_ms(2);
  22.         }

请注意y为浮点型,那么参与计算的常量最好全部写成浮点数,否则会作为整形计算,导致小数都被省略,那么就会显示成一条直线了,不信的可以将32.0改成32看看。。。我这里就不再晒错误的图像了。
给大家看看以上代码显示出来的图像。




本帖子中包含更多资源

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

×
天灵灵地灵灵 发表于 2023-4-24 09:33 | 显示全部楼层
类似case 与break。
eefas 发表于 2023-5-11 15:56 | 显示全部楼层
为什么不使用switch呢              
pixhw 发表于 2023-5-11 16:39 | 显示全部楼层
这个只能执行一次吧。              
youtome 发表于 2023-5-11 19:03 | 显示全部楼层
从大于的条件向下执行。              
tpgf 发表于 2023-5-14 16:48 | 显示全部楼层
这个是正常的现象吧 改完之后就变成了多个if语句了
 楼主| gaoyang9992006 发表于 2023-5-15 09:28 | 显示全部楼层
tpgf 发表于 2023-5-14 16:48
这个是正常的现象吧 改完之后就变成了多个if语句了

是的,所以要严谨,不然容易事与愿违。
xiaoqizi 发表于 2023-5-15 10:19 | 显示全部楼层
一般调试过两个软件的人都不会犯这种低级错误的吧
 楼主| gaoyang9992006 发表于 2023-5-15 10:56 | 显示全部楼层
xiaoqizi 发表于 2023-5-15 10:19
一般调试过两个软件的人都不会犯这种低级错误的吧

其实颠倒一下那几行顺序就OK了,目的就是凑给帖子。
木木guainv 发表于 2023-5-15 11:27 | 显示全部楼层
gaoyang9992006 发表于 2023-5-15 09:28
是的,所以要严谨,不然容易事与愿违。

对于新手来说  还是得经过这种挫折才能记得牢固 别人说的都是浮云
磨砂 发表于 2023-5-15 12:13 | 显示全部楼层
这个错误 看着是挺低级的 但是没准手误就出现错误了
晓伍 发表于 2023-5-15 13:51 | 显示全部楼层
其实很多问题就是因为细节没有处理好导致的
 楼主| gaoyang9992006 发表于 2023-5-15 14:05 | 显示全部楼层
木木guainv 发表于 2023-5-15 11:27
对于新手来说  还是得经过这种挫折才能记得牢固 别人说的都是浮云

是的,不然稀里糊涂的,这个逻辑上就出现错误了,自己却当时还没发现。
 楼主| gaoyang9992006 发表于 2023-5-15 14:06 | 显示全部楼层
晓伍 发表于 2023-5-15 13:51
其实很多问题就是因为细节没有处理好导致的

是的,细节上一定要把握好,代码顺序错一点,或者一点没处理好,可能就事与愿违了,计算机不知道你是想做什么。
八层楼 发表于 2023-5-15 14:42 | 显示全部楼层
这个必须得看好  有时候甚至因为逗号和分号没有写对 都会出现不好排查的问题
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:如果你觉得我的分享或者答复还可以,请给我点赞,谢谢。

2052

主题

16403

帖子

222

粉丝
快速回复 在线客服 返回列表 返回顶部