强制类型转换
指针,为所欲为
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域的主意,于是我的下位机程序中写出这样蹩脚的语句。
阅读(1167) | 评论(0) | 转发(0) |