打印

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

[复制链接]
2168|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的地方
而这样的改动也不影响你对结构体的使用

使用特权

评论回复
5
yuntian|  楼主 | 2012-5-16 10:02 | 只看该作者
是我打错了,原程序是void *p1,*p2;//这里少打了个<*>
回楼上:因为USER_PARA里不止这几个变量,还有好多参数,只是为了简单才写了这几个.
昨天刚发完这贴就试验了一个方法,是可以的,编译也通过,程序也运行正常.
uchar i;
i=(uchar)&user_para.x4-(uchar)&user_para;
这样 i 取得就是偏移地址了.

使用特权

评论回复
6
areshan| | 2012-5-17 01:44 | 只看该作者
为什么要不i写成0+i?如果写成i最有是变量类型不匹配的警告吧,也不是错误吧!
unsigned x1:1;
这个是什么写法呢?

使用特权

评论回复
7
ejack| | 2012-5-17 07:49 | 只看该作者
unsigned x1:1;
这个是什么写法呢?

位域

使用特权

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

本版积分规则

29

主题

178

帖子

1

粉丝