搜索
bottom↓
回复: 34

大家共勉 读I/O口 有一个很隐蔽的错误

[复制链接]

出0入0汤圆

发表于 2013-4-27 20:35:30 | 显示全部楼层 |阅读模式
读P2.0口按键  
if(FIO2PIN&0x01==0)
{
//按键处理函数;




}

设个if语句能执行吗?
明天公布答案

出0入0汤圆

发表于 2013-4-27 20:40:12 | 显示全部楼层
不行哦~ ~改成这样应该可以了:if( ( FIO2PIN & 0x01 ) == 0 )

出0入0汤圆

发表于 2013-4-27 20:40:46 来自手机 | 显示全部楼层
执行的顺序不对  ==的优先级很高的吧!

出0入0汤圆

发表于 2013-4-27 20:49:33 | 显示全部楼层
不是他隐蔽 而是还没搞懂c中运算符的优先级。

出0入0汤圆

发表于 2013-4-28 01:02:35 来自手机 | 显示全部楼层
对于括号,我通常是很大方的,要多少就有多少,而且只多不少

出0入0汤圆

发表于 2013-4-28 01:16:29 | 显示全部楼层
本帖最后由 wangguanfu 于 2013-4-28 01:18 编辑

LZ那个 就少了俩括号 “太吝啬”
看我这个,在Vsync已经等于2的情况下while(0x02!=Vsync); 随机性异常 就是过不去,反正找了N久才找到是这里卡死了
Vsync这个变量是全局变量 在中断里累加,
注意 有试图这样1:Volatile unsigned char Vsync=0;2:unsigned char Vsync=0;3:char=0;3个写法都不行
最后加了个中间变量wcnmdblIAR改写如下解决

while(wcnmdblIAR) /// while(0x02!=Vsync);IAR有病
{
        if(Vsync==2)wcnmdblIAR=0;
          else wcnmdblIAR=1;
}

出105入79汤圆

发表于 2013-4-28 01:29:11 | 显示全部楼层
wangguanfu 发表于 2013-4-28 01:16
LZ那个 就少了俩括号 “太吝啬”
看我这个,在Vsync已经等于2的情况下while(0x02!=Vsync); 随机性异常 就是 ...

写反了吧 ,按习惯应该(Vsync!=2) 或者 while(Vsync-2)

出0入0汤圆

发表于 2013-4-28 01:44:48 | 显示全部楼层
qwe2231695 发表于 2013-4-28 01:29
写反了吧 ,按习惯应该(Vsync!=2) 或者 while(Vsync-2)

我觉得 wangguanfu 这样写的习惯更好呢~~

《C专家编程》一书里面也有提到这样写的好处:

如果把 if( a == 2 ) 写成 if( a =  2 ) 的话,编译器是不会报错的,人工检查也很难查到;

如果把 if( 2 == a ) 写成 if( 2 = a ) 的话,编译器就会报错了~~

出105入79汤圆

发表于 2013-4-28 02:22:04 | 显示全部楼层
BBC 发表于 2013-4-28 01:44
我觉得 wangguanfu 这样写的习惯更好呢~~

《C专家编程》一书里面也有提到这样写的好处:

受教! 见过不少同学写成a=2,不但不能判断,还破坏了a

出0入0汤圆

发表于 2013-4-28 08:44:20 | 显示全部楼层
qwe2231695 发表于 2013-4-28 01:29
写反了吧 ,按习惯应该(Vsync!=2) 或者 while(Vsync-2)

未必  呵呵  while(Vsync-2)?

出0入0汤圆

发表于 2013-4-28 09:02:13 | 显示全部楼层
wangguanfu 发表于 2013-4-28 01:16
LZ那个 就少了俩括号 “太吝啬”
看我这个,在Vsync已经等于2的情况下while(0x02!=Vsync); 随机性异常 就是 ...

被判断的变量如果会在其他函数里面被更改,例如中断,则应该加“volatile”修饰,防止被编译器优化掉,每一次都从原始内存中读取该值。
当然你也可以把IAR的优化关掉,但不建议这样做。

出0入0汤圆

发表于 2013-4-28 09:06:55 | 显示全部楼层
BBC 发表于 2013-4-28 01:44
我觉得 wangguanfu 这样写的习惯更好呢~~

《C专家编程》一书里面也有提到这样写的好处:

" if(a = 2) " 在IAR中会有警告:“在可能应该用 '==' 的地方使用了'=' ”。

"Warning[...]: use of "=" where "==" may have been intended ..."

出0入21汤圆

发表于 2013-4-28 09:11:39 | 显示全部楼层
多打一个括号,我一般都非常习惯打括号,从来不留下任何一个多个的运算符。

出0入0汤圆

发表于 2013-4-28 09:29:55 | 显示全部楼层
LCRPN 发表于 2013-4-28 09:06
" if(a = 2) " 在IAR中会有警告:“在可能应该用 '==' 的地方使用了'=' ”。

"Warning[...]: use of "=" ...

编译器都有警告的。MDK也是警告!

出0入0汤圆

发表于 2013-4-28 10:19:07 | 显示全部楼层
LCRPN 发表于 2013-4-28 09:02
被判断的变量如果会在其他函数里面被更改,例如中断,则应该加“volatile”修饰,防止被编译器优化掉,每 ...

注意 有试图这样1:Volatile unsigned char Vsync=0;

出70入0汤圆

发表于 2013-4-28 10:48:27 | 显示全部楼层
BBC 发表于 2013-4-28 01:44
我觉得 wangguanfu 这样写的习惯更好呢~~

《C专家编程》一书里面也有提到这样写的好处:

C专家编程、C陷阱与缺陷都是很经典的书,不过现在很多写单片机程序的程序员(电工)都是代码自成风格!

出0入0汤圆

发表于 2013-4-28 11:36:58 | 显示全部楼层
wangguanfu 发表于 2013-4-28 10:19
注意 有试图这样1:Volatile unsigned char Vsync=0;

试一下:
while((volatile unsigned char)Vsync != (unsigned char)0x02);
或者:
while(*((volatile unsigned char *)(&Vsync)) != (unsigned char)0x02);

出0入0汤圆

发表于 2013-4-28 12:03:35 来自手机 | 显示全部楼层
握手~ 括号扩起来 结构清楚

出0入0汤圆

发表于 2013-4-28 12:50:53 | 显示全部楼层
wangguanfu 发表于 2013-4-28 01:16
LZ那个 就少了俩括号 “太吝啬”
看我这个,在Vsync已经等于2的情况下while(0x02!=Vsync); 随机性异常 就是 ...

这时候要看反汇编的代码,来判断编译器是否正确处理volatile限定。

出0入0汤圆

 楼主| 发表于 2013-5-2 15:53:24 | 显示全部楼层
cyj_0220 发表于 2013-4-27 20:40
执行的顺序不对  ==的优先级很高的吧!

正解         这个问题调试了半天,悲剧

出0入0汤圆

发表于 2013-5-2 15:57:22 | 显示全部楼层
tiger_999 发表于 2013-5-2 15:53
正解         这个问题调试了半天,悲剧

搞不懂优先级的时候我都用括号限制,这样很安全的

出0入296汤圆

发表于 2013-5-3 10:48:05 | 显示全部楼层
我基本上记不住C语言优先级,所以我总是偷懒的在所有我觉得需要约束优先级的地方加括号——多加又不会死人。

出0入0汤圆

发表于 2013-5-3 11:01:30 | 显示全部楼层
Gorgon_Meducer 发表于 2013-5-3 10:48
我基本上记不住C语言优先级,所以我总是偷懒的在所有我觉得需要约束优先级的地方加括号——多加又不会死人 ...

是啊 加括号  绝对加括号  连( unsigned char *) (num)   我都加括号!

出0入0汤圆

发表于 2013-5-3 11:05:35 | 显示全部楼层
IO 是16位的,你用0xff 与肯定不行

出0入296汤圆

发表于 2013-5-3 11:25:39 | 显示全部楼层
jcrorxp 发表于 2013-5-3 11:01
是啊 加括号  绝对加括号  连( unsigned char *) (num)   我都加括号!

我对指针加括号几乎都快强迫症了……不过好处就是基本上不会犯低级错误了。

出10入0汤圆

发表于 2013-5-3 12:04:56 来自手机 | 显示全部楼层
BBC 发表于 2013-4-28 01:44
我觉得 wangguanfu 这样写的习惯更好呢~~

《C专家编程》一书里面也有提到这样写的好处:

是的,我也从很多书中读到过这种说法;
但是总觉得这么写就跟吃了苍蝇一样难受;
还有,现在的编译器在条件表达式里赋值会警告,当然,不能依赖这个,还得细心。

出10入0汤圆

发表于 2013-5-3 12:07:06 来自手机 | 显示全部楼层
Gorgon_Meducer 发表于 2013-5-3 11:25
我对指针加括号几乎都快强迫症了……不过好处就是基本上不会犯低级错误了。 ...

我也跟你一样,多用括号和空格。
有听过一种说法:
  c语言的优先级,只要记住乘除大于加减,剩下一律括号。

出0入0汤圆

发表于 2013-5-3 13:03:16 | 显示全部楼层
Gorgon_Meducer 发表于 2013-5-3 11:25
我对指针加括号几乎都快强迫症了……不过好处就是基本上不会犯低级错误了。 ...

+1+1               

出0入8汤圆

发表于 2013-5-3 13:07:27 | 显示全部楼层
yoz 发表于 2013-5-3 12:07
我也跟你一样,多用括号和空格。
有听过一种说法:
  c语言的优先级,只要记住乘除大于加减,剩下一律括 ...

同理 俺也是全部加括号,不想判断这个优先级。

出0入0汤圆

发表于 2013-5-3 20:45:17 | 显示全部楼层
学习了,记不住优先级,还是加个括号保险呀

出0入4汤圆

发表于 2013-5-3 20:54:22 | 显示全部楼层
看来习惯性加括号的人还不少呢,俺也是,能加括号的地方都加了

出0入0汤圆

发表于 2013-5-9 16:47:27 | 显示全部楼层
对呀,我是没记住,一般都用括号处理了~

出870入263汤圆

发表于 2013-5-28 14:15:50 | 显示全部楼层
huatong 发表于 2013-4-28 01:02
对于括号,我通常是很大方的,要多少就有多少,而且只多不少

跟我一样,哈哈!我觉得代码尽量傻瓜化,才是好维护好复用的好代码。

出0入0汤圆

发表于 2013-5-31 11:48:42 | 显示全部楼层
细节决定成败啊。

出0入0汤圆

发表于 2013-8-7 09:27:59 | 显示全部楼层
我发现我和好多同学都一样,加括号强迫症!哈哈
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-10 18:23

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

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