打印

宏定义编译的问题

[复制链接]
3637|25
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
沙发
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就编译通不过。

使用特权

评论回复
5
ayb_ice| | 2012-5-28 11:40 | 只看该作者
怎么可能呢
这是因为编译器是按16位有符号数来处理的,
加L就是按32位有符号数,UL就是无符号32位了

使用特权

评论回复
6
hotyong| | 2012-5-28 11:47 | 只看该作者
4# chen3bing

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


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

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
chen3bing + 1
7
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;             //一小时计数器

使用特权

评论回复
8
hotyong| | 2012-5-28 12:11 | 只看该作者
本帖最后由 hotyong 于 2012-5-28 13:52 编辑

能把rec_dat相关的代码也贴出来不..因为报错主要是这个变量..好像是申明错误

使用特权

评论回复
9
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);
}

使用特权

评论回复
10
chen3bing|  楼主 | 2012-5-28 13:16 | 只看该作者
谢谢!8楼,我觉得无符号数可以超过32767,不能超过65535.

使用特权

评论回复
11
ayb_ice| | 2012-5-28 13:27 | 只看该作者
都说了,默认是有符号16位数,范围是-32768~+32767

使用特权

评论回复
12
chen3bing|  楼主 | 2012-5-28 13:38 | 只看该作者
我明白了。我把宏定义去掉,只接把HOUR_CONST的地方换成36000也不行,编译很多错误。我哭了。

使用特权

评论回复
13
hotyong| | 2012-5-28 13:47 | 只看该作者
10# chen3bing

对,我确实错了..

使用特权

评论回复
14
hotyong| | 2012-5-28 13:51 | 只看该作者
就你这程序,写成这个鬼样子..还是直接估计也没什么机密问题..还是整个程序上传吧..让大侠们给你解决吧..

使用特权

评论回复
15
chen3bing|  楼主 | 2012-5-28 14:09 | 只看该作者
谢谢!我把一部分变量定义前面加上xdata就好了。
不过我糊涂了。 ayb_ice大侠说默认是有符号16位数,范围是-32768~+32767。
hotyong怎么又说自己错了。到底是不是默认有符号16位数?

使用特权

评论回复
16
haosj| | 2012-5-28 14:11 | 只看该作者
标志

使用特权

评论回复
17
ayb_ice| | 2012-5-28 14:14 | 只看该作者
不用改xdata, 改idata就好了

使用特权

评论回复
18
hotyong| | 2012-5-28 14:26 | 只看该作者
15# chen3bing
那看样子确实是data空间占用过多了..
我说的是你定义的uint是0~65535,
他们说的默认是-32768~32767应该是指宏定义默认为int,所以范围才是这个..这个数据问题应该是不会影响到编译的.最多是影响实际应用

使用特权

评论回复
19
ucuser| | 2012-5-28 16:15 | 只看该作者
没遇到过这种情况

使用特权

评论回复
20
chen3bing|  楼主 | 2012-5-28 18:46 | 只看该作者
说实话,我还是不懂。为什么定义成24000就可以,定义36000就不行。

使用特权

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

本版积分规则

439

主题

2540

帖子

2

粉丝