9256|8

9803

帖子

24

TA的资源

版主

楼主
 

C语言如何给结构体中的数据定义位域? [复制链接]



正常如果给结构体成员设置大小应该是下边这样

  1. typedef struct
  2. {
  3.     char a:1;    char b:1;
  4.     char c:3;
  5.     char d:3;
  6. }
复制代码


如果想在结构体中定义一个数组,规定数组中每个成员的位域大小应该怎么做?
比如规定buf的长度为4,buf中的每个成员占2位,buf[4]一共占1个字节应该怎么做?
char buf[4];
此帖出自单片机论坛

最新回复

先设置结构体 typedef struct {     char a1:2;        char a2:2;     char a3:2;     char a4:2; }BUF_STRUCT; BUF_STRUCT buf_str; 再设定宏定义 #define buf(x)        buf_str.a##x 写程序的时候x可以设定为1-4,分别寻址。 缺点是x必须是在编译的时候为确定的数,而不是在程序运行的时候才确定的数。  详情 回复 发表于 2018-6-9 10:31
点赞 关注
个人签名虾扯蛋,蛋扯虾,虾扯蛋扯虾
 

回复
举报

1382

帖子

2

TA的资源

五彩晶圆(初级)

沙发
 
似乎没法这么写。bitfield 本身不是一个数据类型。
此帖出自单片机论坛
 
 

回复

732

帖子

2

TA的资源

纯净的硅(中级)

板凳
 
我能想到的最接近的一种做法是联合体
此帖出自单片机论坛
 
个人签名亚里士缺德
 
 

回复

6108

帖子

4

TA的资源

版主

4
 
本帖最后由 damiaa 于 2017-9-4 16:10 编辑

定义8位位域。 搞两个结构,用联合联合起来。如果要操作数组就用另外一个结构。
typedef struct
{
    uint32_t a:1;   
    uint32_t b:1;
    uint32_t c:3;
    uint32_t d:3;
    uint32_t e:8
    uint32_t f:8
    uint32_t g:8
}BITSTR;

typedef struct
{
    uint8_t buf[4];   
}CHRDATASTR;
typedef enum
{
  BITSTR bitS;
  CHRDATASTR byteS;
}CHRORBIT

此帖出自单片机论坛

点评

这种方法buf[0]对应的是a,b,c,d结合后的数据 buf[]内的元素还是没法按位设置和读取  详情 回复 发表于 2017-9-4 18:19
 
 
 

回复

6040

帖子

195

TA的资源

版主

5
 
没太懂你问题的意思,你的意思是实现一个
2bit buf[4]; ?
此帖出自单片机论坛

点评

对就这个意思  详情 回复 发表于 2017-9-4 18:19
 
 
 

回复

9803

帖子

24

TA的资源

版主

6
 
damiaa 发表于 2017-9-4 16:03
定义8位位域。 搞两个结构,用联合联合起来。如果要操作数组就用另外一个结构。
typedef struct
{
    u ...

这种方法buf[0]对应的是a,b,c,d结合后的数据
buf[]内的元素还是没法按位设置和读取
此帖出自单片机论坛
 
 
 

回复

9803

帖子

24

TA的资源

版主

7
 
lcofjp 发表于 2017-9-4 16:26
没太懂你问题的意思,你的意思是实现一个
2bit buf[4]; ?

对就这个意思
此帖出自单片机论坛
 
 
 

回复

6040

帖子

195

TA的资源

版主

8
 
本帖最后由 lcofjp 于 2017-9-4 23:01 编辑

位域成员只能是数值类型,不能是数组类型。按你的意思,应该是要实现这种功能:
  1. struct A{
  2.     unsigned char buf[4]: 2;
  3. };
复制代码

但是这是不合法的,只能想别的办法了。还是分开定义吧。
此帖出自单片机论坛
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

9
 
先设置结构体
typedef struct
{
    char a1:2;   
    char a2:2;
    char a3:2;
    char a4:2;
}BUF_STRUCT;
BUF_STRUCT buf_str;
再设定宏定义
#define buf(x)        buf_str.a##x

写程序的时候x可以设定为1-4,分别寻址。
缺点是x必须是在编译的时候为确定的数,而不是在程序运行的时候才确定的数。
此帖出自单片机论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表