Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1489006
  • 博文数量: 226
  • 博客积分: 3997
  • 博客等级: 少校
  • 技术积分: 2369
  • 用 户 组: 普通用户
  • 注册时间: 2010-06-19 17:26
个人简介

Never save something for a special occasion. Every day in your life is a special occasion.

文章分类

全部博文(226)

文章存档

2018年(5)

2017年(11)

2016年(1)

2015年(17)

2014年(14)

2013年(30)

2012年(5)

2011年(52)

2010年(107)

分类: C/C++

2010-07-02 22:53:10

强制类型转换
指针,为所欲为
 
 

typedef struct DEV_STATUS_TAG
{
 /* 3th byte in frame */
 unsigned char calib:1;
 unsigned char :0;

 /* 4th byte in frame */
 unsigned char bat_in_a:1;
 unsigned char :3;
 unsigned char bat_test_a:1;
 unsigned char :0;

 /* 5th byte in frame */
 unsigned char bat_chg_a:1;
 unsigned char :3;
 unsigned char bat_disc_a:1;
 unsigned char :0;
}DEV_STATUS;

// data field of frame

typedef union FieldData_tag
{
 // little endian

 struct
 {
  unsigned char l;
  unsigned char h;
 }b;
 unsigned long w;
 unsigned char d[1+10]; // if a string, then d: len+data

}FD;

DEV_STATUS gDevStatus; //

FD gData; // data field of frame

gData.w = (ulong)gDevStatus;


编译错误:
将数据类型'struct WORK_RES_TAG' 强制改为'unsigned long'是非法的

错误分析:
1、结构体占3B,需要把第2、3B 赋值给gData.w,这里直接转换整个结构,错得太远了!
2、不能直接转。间接转:先取地址,转为char*,再偏移1,然后转为ulong *,最后取值——折腾吧,想取得结构体的后2字节,还没想到其它办法~
 
gData.w = *((ulong *)((char *)(&gDevStatus) + 1));
 
为什么会写出这般不规则的句子?
这得归咎于通信帧设计得怪异,帧设计为如下固定格式
FH+CMD+IID+DATA
FH  帧起始标志
CMD 命令
IID CMD的参数
DATA 数据,word类型
起初程序只使用DATA域保存数据,后来添加功能,DATA域2B不够用,但又不想扩展DATA域长度,
而此时IID域正好未使用,于是那个程序员打起了IID域的主意,于是我的下位机程序中写出这样蹩脚的语句。
 
阅读(1103) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~