打印

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

[复制链接]
3968|28
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
将军令|  楼主 | 2009-3-16 11:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
从上一层函数代入的数据,到这个函数里面会变化,why?
void delayms(unsigned int  time)
{  //delayms=1ms  of 24Mhz osc
    unsigned int  i;
    unsigned int j;
    for(i=time;i>0;i--)
    {
        j=490; //160
        while(j--);
    }
}
这样一个函数,time有时候会出错,会是什么原因?
从上一层函数带入的数据,到这个函数里面会变化
沙发
yewuyi| | 2009-3-16 16:43 | 只看该作者

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

unsigned int  i;
    unsigned int j;
    for(i=time;i>0;i--)
    {
        j=490; //160
        while(j--);
    }


i是无符号的,但你写i>0,又隐含着认为带符号,这本来就是BUG了把。。。

使用特权

评论回复
板凳
soso| | 2009-3-16 18:08 | 只看该作者

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

  不要一开始就怀疑别人编译器,先怀疑自己吧,要是有这么浅显的错误也能混这么多年,那江湖也也太好混了。建议将你的这个函数搞成可重入函数。

使用特权

评论回复
地板
兰天白云| | 2009-3-17 08:29 | 只看该作者

LZ是在蒙我们吧

使用特权

评论回复
5
将军令|  楼主 | 2009-3-17 10:23 | 只看该作者

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

财到这里寻求答案的

使用特权

评论回复
6
headwolf| | 2009-3-17 17:28 | 只看该作者

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

使用特权

评论回复
7
stghl| | 2009-3-17 21:34 | 只看该作者

好象没有什么问题

你可以看一下编译后代码,会不会别的地方问题.....我都是这样写的,也从未出错过.....

使用特权

评论回复
8
yewuyi| | 2009-3-18 09:49 | 只看该作者

我在2楼说的问题

如果有人认为没问题,那就没办法了。。。

使用特权

评论回复
9
ijk| | 2009-3-18 13:49 | 只看该作者

问题在哪?

  应该不是代码的问题,可能也不是编译器的问题,问题在哪?调试了才知道

使用特权

评论回复
10
yewuyi| | 2009-3-18 14:49 | 只看该作者

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

使用特权

评论回复
11
李冬发| | 2009-3-19 00:07 | 只看该作者

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

i为0假,非0真。

使用特权

评论回复
12
yewuyi| | 2009-3-19 08:53 | 只看该作者

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

有一些编译器是可能要出问题的。


使用特权

评论回复
13
李冬发| | 2009-3-19 11:41 | 只看该作者

MS C或gcc不会有问题吧

使用特权

评论回复
14
胡来一刀| | 2009-3-19 11:56 | 只看该作者

也有类似情况!

我编写的程序:
void DELAYMS(unsigned int ms)
{
    while(ms--){
        ClrWdt();
        
        Delay1KTCYx(4);
    }
}
调试中也出现过ms不准的情况,但是搞不清是调入的时候不对还是减过了头?

使用特权

评论回复
15
DSX_STM32| | 2009-3-19 12:27 | 只看该作者

估计是这样才对

void delayms(unsigned int  time)
{  //delayms=1ms  of 24Mhz osc
    unsigned int  i;
    static unsigned int j=490; //静态变量赋初始值
    for(i=time;i>0;i--)
    {
 /*       j=490; //160   这里赋值不妥*/
        while(j--);
    }
}

使用特权

评论回复
16
李冬发| | 2009-3-19 12:36 | 只看该作者

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

倒是发现过一个局部变量的问题,就是先使用后定义,你会发现,在某种特定的条件下是可以编译通过的,但问题很严重!至少VC6.0里有这个问题。

使用特权

评论回复
17
yewuyi| | 2009-3-19 13:14 | 只看该作者

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

因为i,j都是双字节变量,当执行i、j的过程中,如果发生了中断,那么。。。

使用特权

评论回复
18
李冬发| | 2009-3-19 13:26 | 只看该作者

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

使用特权

评论回复
19
yewuyi| | 2009-3-19 14:39 | 只看该作者

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

使用特权

评论回复
20
李冬发| | 2009-3-20 20:33 | 只看该作者

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

在程序里,只能用最最最基本的语法,绝不要去用技巧。循环只用增量;只用if,不用switch;...

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

180

主题

937

帖子

1

粉丝