搜索
bottom↓
回复: 21

请教一个简单的C语言相等判断问题

[复制链接]

出0入0汤圆

发表于 2017-9-18 23:13:33 | 显示全部楼层 |阅读模式
被一个简单的问题搞蒙了,折腾了一晚上没解决,特来请教。
在STM32F401上做过一个串口接收的程序,运行没问题。现在要移植到F103上,发现接收数据正确,用“==“判断却不相等。编译器是IAR 7.70.1
在F401上判断0XA5,0X5A作为接收标志,接收判断没问题。在F103上接收正确,判断不能通过。后来改成判断0XA5,竟然也不行。
如下图所示,不能进入断点。

本帖子中包含更多资源

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

x

出0入442汤圆

发表于 2017-9-18 23:50:30 来自手机 | 显示全部楼层
貌似你要用byte转换一下。你定义有可能不是byte

出0入0汤圆

发表于 2017-9-19 08:53:19 | 显示全部楼层
是否由于优化引起的呢?

出0入57汤圆

发表于 2017-9-19 09:03:13 | 显示全部楼层
即便是值一样,有符号的和无符号的也是不相等的。

出0入8汤圆

发表于 2017-9-19 09:07:58 | 显示全部楼层
这种问题,去看看对应的汇编输出吧。

出0入0汤圆

发表于 2017-9-19 09:09:17 | 显示全部楼层
volatile 修饰一下试试

出0入0汤圆

 楼主| 发表于 2017-9-19 20:20:19 | 显示全部楼层
多谢各位坛友回复,问题找到了。
最终原因出在变量定义上,本来RX_Date[]是在main.c中定义的,在其他C文件中用extern声明,使用没问题。
前天改了一下,把所有声明放在一个.h文件中,结果在多个文件中引用这个.h文件会因为变量重复声明报的错。
我就想了个投机取巧的办法,在main.c文件中用extern声明了一下。链接和编译都没问题,时机并不能调用RX_Data[],导致了程序出错。
现在老老实实改回在main.c中声明了,虽然不够整洁,贵在能用。

出300入477汤圆

发表于 2017-9-19 21:03:15 来自手机 | 显示全部楼层
qiuchen 发表于 2017-9-19 20:20
多谢各位坛友回复,问题找到了。
最终原因出在变量定义上,本来RX_Date[]是在main.c中定义的,在其他C文件 ...

你说的不够清楚。
正规方法是任何全局变量只能在一个c文件里定义,这个c对应的h文件里写extern声明。别处需要用到它的,就include 这个h文件。
只要永远按这种规则,就不会岀错。

出0入0汤圆

 楼主| 发表于 2017-9-19 21:12:53 | 显示全部楼层
redroof 发表于 2017-9-19 21:03
你说的不够清楚。
正规方法是任何全局变量只能在一个c文件里定义,这个c对应的h文件里写extern声明。别处 ...

我是在一个取名时user.h的文件中定义的,定义时没有加extern。有个.C文件中调用变量比较多,我就直接在这个文件中include,在main.c中用extern声明。
不知道在user.h中直接用extern声明是不是可以,这样的话实际就没有正常声明了。

出0入0汤圆

发表于 2017-9-19 21:45:20 | 显示全部楼层
qiuchen 发表于 2017-9-19 21:12
我是在一个取名时user.h的文件中定义的,定义时没有加extern。有个.C文件中调用变量比较多,我就直接在这 ...

在对应的.h文件声明肯定是没有问题的

出0入0汤圆

发表于 2017-9-20 06:29:52 来自手机 | 显示全部楼层
看到5A,A5就想到迪文屏

出0入0汤圆

发表于 2017-9-20 07:33:17 来自手机 | 显示全部楼层
c中定义,h中声明,基本规则。。。。

出300入477汤圆

发表于 2017-9-20 09:26:24 | 显示全部楼层
本帖最后由 redroof 于 2017-9-20 09:37 编辑
qiuchen 发表于 2017-9-19 21:12
我是在一个取名时user.h的文件中定义的,定义时没有加extern。有个.C文件中调用变量比较多,我就直接在这 ...


h里面不加extern,虽然语法上没问题,但实际应用中就是错的!
C语言的这种形式规则太自由了,你在h里面写任何东西都没人管你,你把C文件后缀改成h也没人管你
就像你拿菜刀可以割自己的手一样,没人管你。
为了防止自己拿菜刀割了自己的手,你自己要给自己制定操作规则:切菜应当如何切,才能保证不被自己的到割到自己的手。

这里面同理,操作规则就是h文件里面只准写变量的extern声明,不准写不带extern的变量定义。
遵守这个规则就保证你不会把同一个东西定义两遍。

另:在h文件里面写函数声明并不需要加extern,因为函数的声明已经隐含是extern的。只要注意非inline的函数体不能写在h文件里面就行。

出0入0汤圆

 楼主| 发表于 2017-9-20 23:01:24 | 显示全部楼层
suny1022 发表于 2017-9-19 21:45
在对应的.h文件声明肯定是没有问题的

我是把一个头文件在两个.C中include了,造成冲突。
在main.c中用extern引用,然后出的问题。

出0入0汤圆

 楼主| 发表于 2017-9-20 23:03:11 | 显示全部楼层
redroof 发表于 2017-9-20 09:26
h里面不加extern,虽然语法上没问题,但实际应用中就是错的!
C语言的这种形式规则太自由了,你在h里面写 ...

明白了,说的太详细了。
非常感谢!以后试试。

出0入0汤圆

 楼主| 发表于 2017-9-20 23:03:57 | 显示全部楼层
Excellence 发表于 2017-9-20 07:33
c中定义,h中声明,基本规则。。。。

哎,还是我自己太菜了,很久没写代码搞得都忘干净了。

出0入0汤圆

发表于 2017-9-21 06:43:09 来自手机 | 显示全部楼层
这个讨论太重要了,初学的很容易搞出这种问题

出0入0汤圆

发表于 2017-9-23 23:16:49 来自手机 | 显示全部楼层
13楼的解答很详细,受教了

出0入0汤圆

发表于 2017-9-24 02:01:06 来自手机 | 显示全部楼层
其实参考ucos定义全局变量的方法也很不错

出0入8汤圆

发表于 2017-9-24 08:05:32 | 显示全部楼层
czlss 发表于 2017-9-20 06:29
看到5A,A5就想到迪文屏

哈哈,是的!!

出0入0汤圆

 楼主| 发表于 2017-9-24 10:10:57 | 显示全部楼层
typedef 发表于 2017-9-24 02:01
其实参考ucos定义全局变量的方法也很不错

多谢!还没看过ucos呢,应该去看看。

出300入477汤圆

发表于 2017-9-24 21:30:37 来自手机 | 显示全部楼层
superAFE 发表于 2017-9-24 20:55
我的做法:用一个variable·c的文件定义全局变量,再用一个variable·h文件来extern将所有全局变量声明为外 ...

这样会引入太多的可见性。
如果一个全局变量只被a和b文件使用,在a里定义,那么b里面引用a.h就行了,别的文件无需见到这个全局变量。
当然对那些大部分文件都需要的全局变量,放在一个专门的文件里让所有文件都引用也行。只是要预备着你在那个头文件里改一点就得重编译全部
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-19 11:27

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

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