宏定义编译的问题

[复制链接]
4903|25
 楼主| chen3bing 发表于 2012-5-28 10:54 | 显示全部楼层 |阅读模式
我把一个宏定义常数由24000改为36000,编译就通不过了。
请问高手,怎么回事?谢谢!
编译图片见附件。

本帖子中包含更多资源

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

×
ayb_ice 发表于 2012-5-28 11:07 | 显示全部楼层
#define HOUR_CONST 36000UL或36000L
 楼主| chen3bing 发表于 2012-5-28 11:24 | 显示全部楼层
谢谢!不好使。
我又试了下,改为32000没问题,超过33000就不行。
 楼主| chen3bing 发表于 2012-5-28 11:26 | 显示全部楼层
最新结果:32767没问题,32768就编译通不过。
ayb_ice 发表于 2012-5-28 11:40 | 显示全部楼层
怎么可能呢
这是因为编译器是按16位有符号数来处理的,
加L就是按32位有符号数,UL就是无符号32位了
hotyong 发表于 2012-5-28 11:47 | 显示全部楼层
4# chen3bing

就猜到是这样的..
我的感觉你的DATA太多了..已经达到了最大值了,我也觉得有点奇怪的是一般情况下DATA超过了127字节就会报错,有时不会,我估计是编译器在某些情况下采用了变量覆盖技术使得它可以编译的吧.


你的程序问题有可能是你的申明变量跟定义不一致导致的,我想尝试也弄出你的问题来而未能成功.建议你把用到这个宏定义的相关代码贴出来看下..

本帖子中包含更多资源

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

×

评分

参与人数 1威望 +1 收起 理由
chen3bing + 1

查看全部评分

 楼主| chen3bing 发表于 2012-5-28 12:02 | 显示全部楼层
if(hour_start_flag==1)
        {
                hour_cnt++;
                if(hour_cnt==HOUR_CONST)
                {
                        hour_cnt=0;
                        hour_start_flag=0;
                        ultimatecomp=0;
                        to_ultimate_flag=0;
                }
        }
xdata uint  hour_cnt;             //一小时计数器
hotyong 发表于 2012-5-28 12:11 | 显示全部楼层
本帖最后由 hotyong 于 2012-5-28 13:52 编辑

能把rec_dat相关的代码也贴出来不..因为报错主要是这个变量..好像是申明错误
 楼主| chen3bing 发表于 2012-5-28 13:14 | 显示全部楼层
#include <STC89C58rd.H>
#include <intrins.h>
#include <absacc.h>
#include "key.h"
#include "tiny13.h"
#include "lcd.h"
#include "zimo.h"
#include "main.h"
bit machine_fault7_flag;          //机故7标志位

xdata uchar temp=0,l,m;
xdata uchar jj;

/*************************************
**函数名称:rs232rec
**功能描述:AD采样子程序
**输入: 无
**输出:无
**返回值:无
**全局变量:k,temp,j,rec_dat[]
**
**调用模块:_nop_ ()
**
**作者:陈长兵
**日期:2012-4-20
***************************************/
void rs232rec()
{
        jj=0;
start:
        jj++;
        if(jj>=3)
                machine_fault7_flag=1;
        if(jj>=3)
                goto ad_end;       
        clk=1;
        _nop_ ();
        _nop_ ();
        _nop_ ();
        clk=0;
        _nop_ ();
        _nop_ ();
        _nop_ ();
        for(j=0;j<20;j++);
        clk=1;
        _nop_ ();
       
       
        ack=1;
        j=0;
        while(1)
        {
                clk=1;
                ack=1;
                j++;
            if(j>=5000)
                        break;;
                if((clk==0)&&(ack==0))
                        break;
        }
        if(j>=5000)
                goto start;
       
        dat=0;
       
        clk=1;
       
        while(clk==1)
        {
                clk=1;
               
        }
       
        dat=1;
        _nop_ ();
        _nop_ ();
        _nop_ ();
        _nop_ ();
        _nop_ ();
       
       
       
        EA=0;
        for(l=0;l<10;l++)
        {
               
                for(m=0;m<8;m++)
                {
                        temp<<=1;
                        dat=1;
                        if(dat==1)
                                temp|=1;
                       
                       
                        #pragma asm
               
SET261:                SETB  P2.6
                       
                        JNB   P2.6, SET261
                       

                        CLR  P3.2
                       

               
SET262:                SETB  P2.6
                       
                        JB    P2.6, SET262
                        SETB  P3.2
               
                        #pragma endasm
                       

                }
               
                rec_dat[l]=temp;
                _nop_ ();
                _nop_ ();
                _nop_ ();
                _nop_ ();
                _nop_ ();
               
        }
ad_end:
           EA=1;
       
}
/*************************************
**函数名称:battery_disp
**功能描述:电池电压显示子程序
**输入: 无
**输出:无
**返回值:无
**全局变量:rec_dat[]
**
**调用模块:Draw_word()
**
**作者:陈长兵
**日期:2012-4-20
***************************************/
void battery_disp()
{
        if(rec_dat[7]>242)
                   Draw_word(20,114,0,8,table1);
        else if(rec_dat[7]>228)
                   Draw_word(21,114,0,8,table1);
        else if(rec_dat[7]>214)
                   Draw_word(22,114,0,8,table1);
        else if(rec_dat[7]>200)
                   Draw_word(23,114,0,8,table1);
        else
                   Draw_word(24,114,0,8,table1);
}
 楼主| chen3bing 发表于 2012-5-28 13:16 | 显示全部楼层
谢谢!8楼,我觉得无符号数可以超过32767,不能超过65535.
ayb_ice 发表于 2012-5-28 13:27 | 显示全部楼层
都说了,默认是有符号16位数,范围是-32768~+32767
 楼主| chen3bing 发表于 2012-5-28 13:38 | 显示全部楼层
我明白了。我把宏定义去掉,只接把HOUR_CONST的地方换成36000也不行,编译很多错误。我哭了。
hotyong 发表于 2012-5-28 13:47 | 显示全部楼层
10# chen3bing

对,我确实错了..
hotyong 发表于 2012-5-28 13:51 | 显示全部楼层
就你这程序,写成这个鬼样子..还是直接估计也没什么机密问题..还是整个程序上传吧..让大侠们给你解决吧..
 楼主| chen3bing 发表于 2012-5-28 14:09 | 显示全部楼层
谢谢!我把一部分变量定义前面加上xdata就好了。
不过我糊涂了。 ayb_ice大侠说默认是有符号16位数,范围是-32768~+32767。
hotyong怎么又说自己错了。到底是不是默认有符号16位数?
haosj 发表于 2012-5-28 14:11 | 显示全部楼层
ayb_ice 发表于 2012-5-28 14:14 | 显示全部楼层
不用改xdata, 改idata就好了
hotyong 发表于 2012-5-28 14:26 | 显示全部楼层
15# chen3bing
那看样子确实是data空间占用过多了..
我说的是你定义的uint是0~65535,
他们说的默认是-32768~32767应该是指宏定义默认为int,所以范围才是这个..这个数据问题应该是不会影响到编译的.最多是影响实际应用
ucuser 发表于 2012-5-28 16:15 | 显示全部楼层
没遇到过这种情况
 楼主| chen3bing 发表于 2012-5-28 18:46 | 显示全部楼层
说实话,我还是不懂。为什么定义成24000就可以,定义36000就不行。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

439

主题

2540

帖子

2

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