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

[复制链接]
2616|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...

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说的问题。。
 楼主| 小海米 发表于 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;
    
}

}
}
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

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