发新帖我要提问
12
返回列表
打印

变量定义用结构体有什么好处?

[复制链接]
楼主: hotpover
手机看帖
扫描二维码
随时随地手机跟帖
21
hotpower| | 2007-7-22 01:45 | 只看该作者 回帖奖励 |倒序浏览

再一个就是枚举的应用了

enum enum_SystemFlag
{
    MainExecFlag,
    EInt0ExecFlag, EInt1ExecFlag,
    Timer0ExecFlag, Timer1ExecFlag, Timer2ExecFlag,
    UsartTxExecFlag, UsartRxExecFlag
};
等同
#define MainExecFlag 0
#define EInt0ExecFlag 1
#define EInt1ExecFlag 2
#define Timer0ExecFlag 3
#define Timer1ExecFlag 4
#define Timer2ExecFlag 5
#define UsartTxExecFlag 6
#define UsartRxExecFlag 7

使用特权

评论回复
22
HOTPOVER| | 2007-7-22 02:01 | 只看该作者

增长见识了,谢谢菜农!!

使用特权

评论回复
23
救火车| | 2007-7-22 02:07 | 只看该作者

倒了就睡觉去吧。

使用特权

评论回复
24
hotpower| | 2007-7-22 02:08 | 只看该作者

牛车还没来,让俺走夜路???俺怕黑遇到鬼~~~

使用特权

评论回复
25
computer00| | 2007-7-22 02:11 | 只看该作者

倒塌了.....睡觉去..........

使用特权

评论回复
26
洪七公| | 2007-7-22 02:12 | 只看该作者

哈哈~~~小孩要休眠10小时才能长身体!!!

使用特权

评论回复
27
gyt| | 2007-7-22 10:48 | 只看该作者

10小时?

厉害厉害!!!

使用特权

评论回复
28
古道热肠| | 2007-7-22 10:48 | 只看该作者

都在议结构体,我有个遗留问题,拿出来晒晒

  有一结构体定义,在Keil C下能编译通过,在BC4.0环境编译报错,大家看看如何改改才能合BC的要求。

Keil C环境如下:
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long

/*汉字X方向宽度*/
#define HZ_SIZE_X                2
/*汉字Y方向宽度*/
#define HZ_SIZE_Y                16

#define HZ_NUM                    128

typedef struct _HzModel
{
    /* 汉字内码 */
    uint uiHZcode;

    /* 点阵字模 向下为x,向右为y*/
    uchar model[HZ_SIZE_X][HZ_SIZE_Y];

}HZ_MODEL;

code HZ_MODEL ZK_Data[]=
{
    {    0xD0BB,  //谢
        0x02,0x08,0x44,0x88,0x2F,0xC8,0x28,0x88,0x0F,0x88,0x08,0xFE,0xEF,0x88,0x28,0x88,
        0x28,0xC8,0x3F,0xA8,0x21,0xA8,0x2A,0x88,0x34,0x88,0x28,0x88,0x12,0xA8,0x01,0x10},

    {    0xCAB9,  //使
        0x10,0x40,0x10,0x44,0x1F,0xFE,0x20,0x40,0x27,0xFC,0x64,0x44,0xA4,0x44,0x24,0x44,
        0x27,0xFC,0x24,0x44,0x22,0x40,0x21,0x80,0x20,0xC0,0x21,0x30,0x26,0x0E,0x28,0x04},
......
}

BC环境如下
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long

/*汉字X方向宽度*/
#define HZ_SIZE_X                2
/*汉字Y方向宽度*/
#define HZ_SIZE_Y                16

#define HZ_NUM                    128

typedef struct _HzModel
{
    /* 汉字内码 */
    uint uiHZcode;

    /* 点阵字模 向下为x,向右为y*/
    uchar model[HZ_SIZE_X][HZ_SIZE_Y];

}HZ_MODEL;

const HZ_MODEL ZK_Data[]=
{
    {    0xD0BB,  //谢
        0x02,0x08,0x44,0x88,0x2F,0xC8,0x28,0x88,0x0F,0x88,0x08,0xFE,0xEF,0x88,0x28,0x88,
        0x28,0xC8,0x3F,0xA8,0x21,0xA8,0x2A,0x88,0x34,0x88,0x28,0x88,0x12,0xA8,0x01,0x10},

    {    0xCAB9,  //使
        0x10,0x40,0x10,0x44,0x1F,0xFE,0x20,0x40,0x27,0xFC,0x64,0x44,0xA4,0x44,0x24,0x44,
        0x27,0xFC,0x24,0x44,0x22,0x40,0x21,0x80,0x20,0xC0,0x21,0x30,0x26,0x0E,0x28,0x04},

    {    0xD3C3,  //用
        0x00,0x08,0x3F,0xFC,0x21,0x08,0x21,0x08,0x21,0x08,0x3F,0xF8,0x21,0x08,0x21,0x08,
        0x21,0x08,0x3F,0xF8,0x21,0x08,0x21,0x08,0x21,0x08,0x41,0x08,0x41,0x28,0x80,0x10},

......
};

使用特权

评论回复
29
平常人| | 2007-7-22 11:56 | 只看该作者

古版把你的编译报错信息抄出来,估计问题不大

估计你的编译器不支持数组分量数目不定的初始化,即这个语句中必须规定分量数目:
  const HZ_MODEL ZK_Data[这里不能为空]=

使用特权

评论回复
30
古道热肠| | 2007-7-22 13:35 | 只看该作者

贴上出错信息

 全是一种错误:initialization is only partially bracketed,用平常人介绍的方法明确数组上标如const HZ_MODEL ZK_Data[44]=...... 也无效,还是报同样故障
详见下图

使用特权

评论回复
31
hotpower| | 2007-7-22 13:50 | 只看该作者

这个如何???

估计问题在uchar model[HZ_SIZE_X][HZ_SIZE_Y];

uchar model[2][16];

感觉以下可用.

const HZ_MODEL ZK_Data[]=
{
    {    0xD0BB,  //谢
        {
          {0x02,0x08,0x44,0x88,0x2F,0xC8,0x28,0x88,0x0F,0x88,0x08,0xFE,0xEF,0x88,0x28,0x88},
          {0x28,0xC8,0x3F,0xA8,0x21,0xA8,0x2A,0x88,0x34,0x88,0x28,0x88,0x12,0xA8,0x01,0x10}
        }
    },

    {    0xCAB9,  //使
        {
          {0x10,0x40,0x10,0x44,0x1F,0xFE,0x20,0x40,0x27,0xFC,0x64,0x44,0xA4,0x44,0x24,0x44},
          {0x27,0xFC,0x24,0x44,0x22,0x40,0x21,0x80,0x20,0xC0,0x21,0x30,0x26,0x0E,0x28,0x04}
        }
    },

    {    0xD3C3,  //用
        {
          {0x00,0x08,0x3F,0xFC,0x21,0x08,0x21,0x08,0x21,0x08,0x3F,0xF8,0x21,0x08,0x21,0x08},
          {0x21,0x08,0x3F,0xF8,0x21,0x08,0x21,0x08,0x21,0x08,0x41,0x08,0x41,0x28,0x80,0x10}
        }
    },

......
};

使用特权

评论回复
32
古道热肠| | 2007-7-22 15:02 | 只看该作者

搞清楚毛病在哪了,先谢谢楼上几位

  经过测试,发现在BC4环境下,这个结构体数组不能大,在1K以下还正常,多加一个汉字的点阵(34Byte)编译马上报前面贴图上的错误了,后回退到BC3.1环境编译调试一切正常,可能与环境设置有关。但前面这种结构体用法是正确的。

使用特权

评论回复
33
hotpower| | 2007-7-22 15:07 | 只看该作者

正确但不正规~~~

使用特权

评论回复
34
769854714| | 2014-6-17 15:37 | 只看该作者
用结构体程序看得好晕,一个变量绕来绕去!

使用特权

评论回复
35
lussby| | 2014-12-23 15:20 | 只看该作者
yewuyi 发表于 2007-7-20 09:33

版主,您好,我在此问题的基础上再问另外一个问题,一个结构体在多个函数中出现,为什么要在函数声明和调用要用&这样的符号呢?下面我用一段DS1302的代码,希望能给我指点下为什么要这样写和声明,期待您和各位前辈回答,谢谢!:/**************************定义一个关于时间的结构体*******************************/
typedef struct _SYSTEMTIME_    //声明结构体
{
        uint8_t Sec;       //秒
        uint8_t Min;       //分
        uint8_t Hour;      //时
        uint8_t Date;      //日期
        uint8_t Month;     //月份
        uint8_t Week;      //星期
        uint8_t Year;      //年
        uint8_t DateStr[10];
    uint8_t TimeStr[9];
}SYSTEMTIME;      
extern uchar dec_hour,dec_min,dec_sec;
extern uchar dec_year,dec_month,dec_data,dec_week;
void DS1302_GetTime(SYSTEMTIME *Time);//读取时间
void TimeToStr(SYSTEMTIME *Time);//把时间转化成字符串
void DateToStr(SYSTEMTIME *Time);//把日期转化成字符串
void TimeToDec(SYSTEMTIME *pTime);//把时间转化成十进制数

使用特权

评论回复
36
yewuyi| | 2014-12-23 20:07 | 只看该作者
&

取地址

使用特权

评论回复
37
ayb_ice| | 2016-8-17 17:01 | 只看该作者
我感觉最大的好处是可以直接用=操作,其次修改方便,可读性,可维护性强

使用特权

评论回复
38
kodec2104| | 2016-8-19 09:42 | 只看该作者
lussby 发表于 2014-12-23 15:20
版主,您好,我在此问题的基础上再问另外一个问题,一个结构体在多个函数中出现,为什么要在函数声明和调 ...

&这个是个取地址符号,这些调用的函数是想修改函数参数的值,必须通过对地址操作才能修改,你如果直接把变量作为参数传递进去是修改不了这个变量的值的。

使用特权

评论回复
39
lussby| | 2017-4-24 14:04 | 只看该作者
kodec2104 发表于 2016-8-19 09:42
&这个是个取地址符号,这些调用的函数是想修改函数参数的值,必须通过对地址操作才能修改,你如果直接把变 ...

现在弄明白了,谢谢!

使用特权

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

本版积分规则