18F的编译器有点癫狂??

[复制链接]
 楼主| 将军令 发表于 2009-3-16 11:58 | 显示全部楼层 |阅读模式
从上一层函数代入的数据,到这个函数里面会变化,why?<br />void&nbsp;delayms(unsigned&nbsp;int&nbsp;&nbsp;time)<br />{&nbsp;&nbsp;//delayms=1ms&nbsp;&nbsp;of&nbsp;24Mhz&nbsp;osc<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;int&nbsp;&nbsp;i;<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;int&nbsp;j;<br />&nbsp;&nbsp;&nbsp;&nbsp;for(i=time;i&gt0;i--)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;j=490;&nbsp;//160<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(j--);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br />这样一个函数,time有时候会出错,会是什么原因?<br />从上一层函数带入的数据,到这个函数里面会变化
yewuyi 发表于 2009-3-16 16:43 | 显示全部楼层

程序写法就值得商榷。。。

unsigned&nbsp;int&nbsp;&nbsp;i;<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;int&nbsp;j;<br />&nbsp;&nbsp;&nbsp;&nbsp;for(i=time;i&gt0;i--)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;j=490;&nbsp;//160<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(j--);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br /><br />i是无符号的,但你写i&gt0,又隐含着认为带符号,这本来就是BUG了把。。。
soso 发表于 2009-3-16 18:08 | 显示全部楼层

我倒是觉得你犯了函数多重调用的毛病

  不要一开始就怀疑别人编译器,先怀疑自己吧,要是有这么浅显的错误也能混这么多年,那江湖也也太好混了。建议将你的这个函数搞成可重入函数。
兰天白云 发表于 2009-3-17 08:29 | 显示全部楼层

LZ是在蒙我们吧

  
 楼主| 将军令 发表于 2009-3-17 10:23 | 显示全部楼层

这是我同事写的代码,出问题了,我一时半会解决不了

财到这里寻求答案的
headwolf 发表于 2009-3-17 17:28 | 显示全部楼层

i!=0。>0这样的写法一定要慎重

  
stghl 发表于 2009-3-17 21:34 | 显示全部楼层

好象没有什么问题

你可以看一下编译后代码,会不会别的地方问题.....我都是这样写的,也从未出错过.....
yewuyi 发表于 2009-3-18 09:49 | 显示全部楼层

我在2楼说的问题

如果有人认为没问题,那就没办法了。。。
ijk 发表于 2009-3-18 13:49 | 显示全部楼层

问题在哪?

&nbsp;&nbsp;应该不是代码的问题,可能也不是编译器的问题,问题在哪?调试了才知道
yewuyi 发表于 2009-3-18 14:49 | 显示全部楼层

LZ把我在2楼说的问题修改了以后再说

  
李冬发 发表于 2009-3-19 00:07 | 显示全部楼层

i > 0 有什么问题?晕。就是无符号,这句也正常的很。

i为0假,非0真。<br /><br />
yewuyi 发表于 2009-3-19 08:53 | 显示全部楼层

TO LS:i定义为无符号的时候,

有一些编译器是可能要出问题的。<br /><br /><br />
李冬发 发表于 2009-3-19 11:41 | 显示全部楼层

MS C或gcc不会有问题吧

  
胡来一刀 发表于 2009-3-19 11:56 | 显示全部楼层

也有类似情况!

我编写的程序:<br />void&nbsp;DELAYMS(unsigned&nbsp;int&nbsp;ms)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;while(ms--){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ClrWdt();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Delay1KTCYx(4);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br />调试中也出现过ms不准的情况,但是搞不清是调入的时候不对还是减过了头?<br />
DSX_STM32 发表于 2009-3-19 12:27 | 显示全部楼层

估计是这样才对

void&nbsp;delayms(unsigned&nbsp;int&nbsp;&nbsp;time)<br />{&nbsp;&nbsp;//delayms=1ms&nbsp;&nbsp;of&nbsp;24Mhz&nbsp;osc<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;int&nbsp;&nbsp;i;<br />&nbsp;&nbsp;&nbsp;&nbsp;static&nbsp;unsigned&nbsp;int&nbsp;j=490;&nbsp;//静态变量赋初始值<br />&nbsp;&nbsp;&nbsp;&nbsp;for(i=time;i&gt0;i--)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;/*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;j=490;&nbsp;//160&nbsp;&nbsp;&nbsp;这里赋值不妥*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(j--);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br />
李冬发 发表于 2009-3-19 12:36 | 显示全部楼层

倒是发现过一个局部变量的问题

倒是发现过一个局部变量的问题,就是先使用后定义,你会发现,在某种特定的条件下是可以编译通过的,但问题很严重!至少VC6.0里有这个问题。
yewuyi 发表于 2009-3-19 13:14 | 显示全部楼层

暂时不谈符号的问题,这个CODE还有一个隐含问题存在

因为i,j都是双字节变量,当执行i、j的过程中,如果发生了中断,那么。。。
李冬发 发表于 2009-3-19 13:26 | 显示全部楼层

双字节运算发生中断倒没有事,只有共享变量才有临界区的

  
yewuyi 发表于 2009-3-19 14:39 | 显示全部楼层

如LS所说,我看错了,在此的局部变量不会出现双字节的问题

  
李冬发 发表于 2009-3-20 20:33 | 显示全部楼层

PICC,BUG还是比较多的,只能小心翼翼的用

在程序里,只能用最最最基本的语法,绝不要去用技巧。循环只用增量;只用if,不用switch;...
您需要登录后才可以回帖 登录 | 注册

本版积分规则

180

主题

937

帖子

1

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