想到C语言结构体的一个怪问题, 看怎么做最优化

[复制链接]
2678|7
 楼主| yuntian 发表于 2012-5-15 21:17 | 显示全部楼层 |阅读模式
本帖最后由 yuntian 于 2012-5-15 21:27 编辑

struct
{unsigned x1:1;
   char x2;
   int x3;
   char x4;
}user_para;

现在我想在程序中保存x4这个变量到EEPROM中去,因为其它变量未变更,所以
只想保存这一个.

void save(void)
{void *p1,p2;  //定义两个无类型指针
  char i;
  p1=&user_para; //指向结构体
  p2=&user_para.x4; //指向要保存的变量
  i=(char)(p2-p1); //计算变量相对于结构体的偏移地址
  erprom_write( sizeof(x4),0+i,&user_para.x4); //保存到偏移地址去.

}
用的是C18的编译器,只有这样写才能通过编译,不知道是否还有其它的写法,
当然也可以直接看成员变量的编译后的地址就可以直接在程序里在0+I这里给
一个合适的值就可以了,但这样会造成程序不具有通用性,各位有没有更好的办**
sjnh 发表于 2012-5-15 21:54 | 显示全部楼层
void *p1,p2;  //定义两个无类型指针
这个定义P2不是指针
ejack 发表于 2012-5-16 07:53 | 显示全部楼层
同上,楼主栽倒在了一个隐蔽的小地方。

这地方你修改之前肯定会报错的。只能说楼主在看到报警的时候没有进行探究,一心只想着解决问题而没有分析问题。
sunhq02 发表于 2012-5-16 08:28 | 显示全部楼层
把结构体的定义调整一下
struct
{
   char x4;   
   char x2;
   int x3;
   unsigned x1:1;
}user_para;
由结构体成员的对齐特性和内存分布规律, x4肯定在偏移0的地方
而这样的改动也不影响你对结构体的使用
 楼主| yuntian 发表于 2012-5-16 10:02 | 显示全部楼层
是我打错了,原程序是void *p1,*p2;//这里少打了个<*>
回楼上:因为USER_PARA里不止这几个变量,还有好多参数,只是为了简单才写了这几个.
昨天刚发完这贴就试验了一个方法,是可以的,编译也通过,程序也运行正常.
uchar i;
i=(uchar)&user_para.x4-(uchar)&user_para;
这样 i 取得就是偏移地址了.
areshan 发表于 2012-5-17 01:44 | 显示全部楼层
为什么要不i写成0+i?如果写成i最有是变量类型不匹配的警告吧,也不是错误吧!
unsigned x1:1;
这个是什么写法呢?
ejack 发表于 2012-5-17 07:49 | 显示全部楼层
unsigned x1:1;
这个是什么写法呢?

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

本版积分规则

29

主题

178

帖子

1

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