打印

求助高手!遇到一个很奇怪的问题(单片机 c语言程序)

[复制链接]
1830|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
小海米|  楼主 | 2007-9-24 11:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
void EpsavRam(void)          
{
  unsigned char i;
  double xdata PEnergy[4];
  DS1302GetTime(  );
  Check_TNow();
  EnableWDI();
for(i=0;i<4;i++)

PEnergy=Formusel(Meter7022,ReadSPI(Meter7022));
if( Energy < 99999999 )   //####1
Energy = Energy + PEnergy;
else
Energy =(Energy-99999999) + PEnergy;
if(cursdt.curSDnum !=0)                                                             
{
if( Energy[i+(cursdt.sdtNow->flvnum)*4] < 99999999 )  //####2
Energy[i+(cursdt.sdtNow->flvnum)*4] += PEnergy;
else
Energy[i+(cursdt.sdtNow->flvnum)*4] =(Energy[i+(cursdt.sdtNow->flvnum)*4]-99999999)+PEnergy;}    
}
}
说明:Formusel是一个返回数据为double类型的函数
单片机:stc89c516   ram1280   
我写的程序编译好后:data 92.7  xdata 881
奇怪的问题是:见上面标号://####1  和 //####2 处,无论if后面括号的关系表达式判断的结果为真还是为假,程序都不执行if后面的语句,只是执行else后面的语句。
请高手帮忙!谢谢各位热心人!

相关帖子

沙发
taoest| | 2007-9-24 12:12 | 只看该作者

Energy[]

不见Energy[]的定义

使用特权

评论回复
板凳
mxh0506| | 2007-9-24 12:28 | 只看该作者

Energy[]也是double吗?

查一下编译器手册,是否支持double类型
我记得有些单片机的C编译器把double和float同等看待
如果是这样,程序里的99999999已经超过float可以表达的有效数据位数了

比如,KEIL C51实际上是不支持double类型的,但double类型声明的关键字可以出现的程序中,而不报错,下面是KEIL技术支持中的问与答:

QUESTION
How do I enable 64-bit double-precision floating-point in C51?

ANSWER
C51 provides IEEE 32-bit floating-point math but does not support 64-bit floating-point math. 64-bit math would be extremely slow on the 8051.

The double type is supported syntactically but is identical in implementation to the float type.


另外没看到最初的Energy[]赋值语句,执行到if语句时它的值到底是多少?

使用特权

评论回复
地板
ayb_ice| | 2007-9-24 13:19 | 只看该作者

KEIL C51里double = float...

使用特权

评论回复
5
xc_cz| | 2007-9-24 15:43 | 只看该作者

我用KEIL C测试的

void main(){
    double xx;
    xx=222.2;
    if(xx<99999999)
        xx=1;
    else xx=0;
    while(1);
}
结果XX=1;没遇到LZ说的问题。。

使用特权

评论回复
6
小海米|  楼主 | 2007-9-24 15:52 | 只看该作者

谢谢大家!

函数中的Energy[]在我的程序中是全局变量,在初始化函数中已经赋初值为0;
很奇怪,我把函数改成下面的样子就可以了:
void EpsavRam(void)          
{
    unsigned char i,flag;
    double xdata PEnergy[4];

  DS1302GetTime(  );
  Check_TNow();
  EnableWDI();
for(i=0;i<4;i++)

PEnergy=Formusel(Meter7022,ReadSPI(Meter7022));
flag = Energy < 99999999;
if( flag ) 
 Energy = Energy + PEnergy;
else
 Energy =(Energy-99999999) + PEnergy;
(cursdt.curSDnum != 0)                                                            
{
flag = Energy[i+(cursdt.sdtNow->flvnum)*4] < 99999999;
if( flag )
Energy[i+(cursdt.sdtNow->flvnum)*4] += PEnergy;
else
Energy[i+(cursdt.sdtNow->flvnum)*4] =(Energy[i+(cursdt.sdtNow->flvnum)*4]-99999999)+PEnergy;
    
}

}
}

使用特权

评论回复
7
xc_cz| | 2007-9-24 16:18 | 只看该作者

还是没问题

#include<reg52.h>
double xx=0;
void main(){
    

    if(xx<99999999)
        xx=1;
    else xx=0;
    while(1);
}

改成这样同样没有问题。。。不知道是不是你的编译器有问题。。

使用特权

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

本版积分规则

1

主题

2

帖子

1

粉丝