搜索
bottom↓
回复: 27

睁开您的火眼金睛,请问我的代码两种表达方式逻辑上有...

[复制链接]

出0入0汤圆

发表于 2012-9-11 14:29:26 | 显示全部楼层 |阅读模式
本帖最后由 zhilve 于 2012-9-11 14:52 编辑

/******************************************************************************/
代码一
        if ((InputI<MinI)||(InputI>MaxI))
        {
                InputI = MinI;
        }
/******************************************************************************/
代码二
        if ((InputI>MinI)&&(InputI<MaxI))
        {
        }
        else
        {
                InputI = MinI;
        }
/******************************************************************************/
我在工程中,经测试发现代码一,溢出了,代码二得到了想要的结果,我想请问,代码一和二在逻辑上有什么不同吗

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2012-9-11 14:36:10 | 显示全部楼层
没看出来……

出0入0汤圆

发表于 2012-9-11 14:37:52 | 显示全部楼层
没看出问题
具体是哪里溢出?

出0入0汤圆

 楼主| 发表于 2012-9-11 14:51:32 | 显示全部楼层
代码一,会出现InputV在数码管显示0的现象

出0入0汤圆

发表于 2012-9-11 14:55:01 | 显示全部楼层
代码一
当InputI<MinI就执行了,后面的条件可以不用执行

出0入0汤圆

发表于 2012-9-11 14:55:06 | 显示全部楼层
调试一下代码一,看看有没有执行进去

出0入0汤圆

发表于 2012-9-11 15:02:34 | 显示全部楼层
代码1和代码2逻辑稍有区别,就是InputI=MinI或者InputI=MaxI时。
在代码2正确的前提下,你将代码1的条件判断里改成<=和>=,这样2段代码就完全一样了。

出0入0汤圆

发表于 2012-9-11 15:17:11 | 显示全部楼层
同意楼上

出0入0汤圆

发表于 2012-9-11 15:31:57 | 显示全部楼层
同意。。

出0入0汤圆

发表于 2012-9-11 15:44:32 | 显示全部楼层
先看下你的数据类型定义,然后检查下两者的汇编代码有什么区别

出0入0汤圆

发表于 2012-9-11 18:16:59 | 显示全部楼层
这两个if条件并不是互补的呀,所以结果当然不一样

出0入0汤圆

发表于 2012-9-11 18:30:35 | 显示全部楼层
同意5楼的意见

出0入0汤圆

发表于 2012-9-11 18:37:41 | 显示全部楼层
jpchen 发表于 2012-9-11 15:02
代码1和代码2逻辑稍有区别,就是InputI=MinI或者InputI=MaxI时。
在代码2正确的前提下,你将代码1的条件判 ...

同意
补充字数
头像被屏蔽

出0入0汤圆

发表于 2012-9-11 21:54:47 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

出0入0汤圆

 楼主| 发表于 2012-9-13 17:14:37 | 显示全部楼层
经测试 改代码为
                if ((InputV>=MinV)&&(InputV<=MaxV))
                {
               
                }
                else
                {
                        InputV = MinV;
                }
                if ((InputI>=MinI)&&(InputI<=MaxI))
                {
                }
                else
                {
                        InputI = MinI;
                }
还是和代码一有差别。代码一执行后,数码管有可能显示为0,限制条件没有生效
而上面的代码能起限制作用,求解释

出0入0汤圆

发表于 2012-9-13 17:33:24 | 显示全部楼层
需要知道InputV这个变量的类型。是unsigned还是signed?
MinV呢

出0入0汤圆

发表于 2012-9-13 17:34:58 | 显示全部楼层
当InputV是unsigned,若程序意外使得InputV为负数,那么InputV的数值将反转为正数。因为unsigned是8位存储的。

出0入0汤圆

 楼主| 发表于 2012-9-14 08:42:40 | 显示全部楼层
inputV和inputI 都是浮点 MinI和MinV是宏定义

出0入0汤圆

发表于 2012-9-14 08:59:12 | 显示全部楼层
实际最好办法就是单步仿真下,看看每步跟自己理解是否相同,如有不同在去体会这代码为什么会这样执行!就可以了!

出0入0汤圆

发表于 2012-9-15 12:10:46 | 显示全部楼层
代码1是两个条件只要有一个成立就执行;代码2是两个条件同时成立才执行;
头像被屏蔽

出0入0汤圆

发表于 2012-9-15 12:46:06 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

出200入2554汤圆

发表于 2012-9-17 10:11:48 | 显示全部楼层
zhilve 发表于 2012-9-14 08:42
inputV和inputI 都是浮点 MinI和MinV是宏定义

比较浮点数的临界值,本来就容易出问题吧:

1. 浮点数的舍入误差可能造成 x.999999  被舍弃成 x 而不是进位成 (x+1)

2. 判定浮点数间的 > 和 >= 关系的区别,很容易因为舍入误差而把等号干掉吧

建议在此步放弃浮点,建议使用 x10 x100... 之类办法把浮点数转成整形数再处理

出0入0汤圆

 楼主| 发表于 2012-11-10 08:44:23 | 显示全部楼层
楼上的方法不失为一个好方法。从代码层面切实很难发现问题。

出0入0汤圆

发表于 2012-11-10 09:16:20 | 显示全部楼层
感觉是数据类型不合适

出0入0汤圆

 楼主| 发表于 2012-11-19 15:49:16 | 显示全部楼层
找出原因了 ,浮点数,除了一般数值,还存在,无穷大,无穷小,不存在(NaN),我的例子是读取EEPROM的值,如果不在范围内就要进行最小值或者最大值的重新赋值。如果读取失败 读取的应该是 FFFFFFFF FFFFFFFF FFFFFFFF,这样这个数就是NaN了,所以在后面的判断中出现了不可预料的情况。在此还是要谢谢以上各位的热心帮助

出0入42汤圆

发表于 2012-11-19 16:02:00 | 显示全部楼层
谢谢楼主分享问题原因

出0入0汤圆

发表于 2012-11-19 16:11:11 | 显示全部楼层
又学习到了,谢楼主分享经验

出0入0汤圆

发表于 2012-11-20 17:33:35 | 显示全部楼层
不错,之前也遇见过关于float的相关问题,mark
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-7-24 04:17

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

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