打印
[AVR单片机]

共同体和结构体的问题

[复制链接]
2007|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
litudong616|  楼主 | 2011-12-11 17:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
刚看到一段PIC单片机程序如下,不知道“unsigned char alls;”这一句是不是必须要? 它在这个公共体中的作用,还有就是在共同体中嵌结构的作用主要是什么,不太明白?
还有就是怎么将这个共同体定义为全局变量,我是分文件写的程序
union
{
        unsigned char  alls;
        struct
        {
                unsigned int cat:1;   
unsigned int high_p:1;  
unsigned int low_p:1;   
unsigned int door:1;
unsigned int catck_en:1;               
                unsigned int s_on:1;
                unsigned int s_hl:1;
                unsigned int ad_en:1;                       
}bits;
}workflag;

相关帖子

沙发
sjl2006| | 2011-12-11 18:19 | 只看该作者
本帖最后由 sjl2006 于 2011-12-11 18:28 编辑

定义alls的主要目的是对这个共用体做一次性赋值和取值。如果没有alls的定义,这个union就不叫union了。
在共用体中嵌结构的主要目的是对alls的指定位域做赋值和取值,如:
假设定义了workflag i,那么可以用i.bits.cat去访问alls的第一个bit。你这个是8位机,应该是MSB。如果是32位机,具体是alls的MSB还是LSB取决于字节序。如果是big endian,是MSB,否则是LSB。
定义其为全局变量与其他类型如int型的全局定义无区别。

使用特权

评论回复
板凳
litudong616|  楼主 | 2011-12-11 20:46 | 只看该作者
你好,我用的是PIC的八位单片机PIC16f887
我就是在定义为全局变量时编译通不过,就是按你说的方法定义的
现在**.c建立上诉程序;
然后在**.h中extern workflag.bits;
然后在要用到的****.c中  #include “**.h”
我其他变量都这可以编译通过,但就是这个结构体不行,请问一下错误在哪里啊

使用特权

评论回复
地板
sjl2006| | 2011-12-13 13:33 | 只看该作者
extern workflag.bits用错了,workflag是个union类型声明,不是变量定义,同理对于workflag.bits,它也只是个类型声明。编译器无法为workflag.bits分配空间。你看我写的是workflag i,你可以在其他文件中extern workflag i。union只能按共用体类型分配空间,分配的空间是其中占地方最大的那个类型的大小。

使用特权

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

本版积分规则

0

主题

7

帖子

1

粉丝