关于结构体嵌套中的数组

luopochengxuyuan 2012-02-16 03:02:34
看了几个小时了,还是没弄明白,现在把相关的定义都贴出来,请各位帮忙

#define ECCSMSG8 (*((struct eccsmsg8 *)(CANDATA[ECCSMSG8_DEF].DATA)))

#define ECCSMSG8_DEF 14

struct candata
{
struct dataflg FLG;
uchar8 COUNT;
uchar8 DATA[8];
};

#define CANDATA ((struct candata *)&vCANDATA_bios)

uchar8 CANDATA_bios[37][10] ;

struct eccsmsg8
{
uchar8 DTCCODE_L; /* DT0 */
uchar8 DTCCODE_H; /* DT1 */
uchar8 ENSTNG :1; /* DT2 bit7 */
uchar8 ECMNG :1; /* DT2 bit6 */
uchar8 ETCNG :1; /* DT2 bit5 */
uchar8 FCNG :1; /* DT2 bit4 */
uchar8 CANNGF :1; /* DT2 bit3 */
uchar8 :1; /* DT2 bit2 */
uchar8 ECSMSG8C :2; /* DT2 bit1-0 */
uchar8 :8; /* DT3 */ /* [192]M */
uchar8 :8; /* DT4 */ /* [192]M */
uchar8 :6; /* DT5 bit7-2 */ /* [192]M */
uchar8 ISSAP :1; /* DT5 bit1 */ /* [192]M */
uchar8 SPTMD_LMP :1; /* DT5 bit0 */ /* [192]M */
uchar8 IDSTSTB :1; /* DT6 bit7 */ /* [192]M */
uchar8 IDSTSTS :1; /* DT6 bit6 */ /* [192]M */
uchar8 ISACT :1; /* DT6 bit5 */ /* [192]M */
uchar8 ISBRKREQ :1; /* DT6 bit4 */ /* [192]M */
uchar8 ISINDMD :2; /* DT6 bit3-2 */ /* [192]M */
uchar8 ISMSKSW :1; /* DT6 bit1 */ /* [192]M */
uchar8 CHRGLREQ :1; /* DT6 bit0 */ /* [192]M */
uchar8 SHARE_ECO_BOOST :8; /* DT7 */ /* [206]M */
};


vCANDATA_bios[14][9]即ECCSMSG8.SHARE_ECO_BOOST,是怎么得来的?
...全文
651 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
luopochengxuyuan 2012-02-20
  • 打赏
  • 举报
回复
今天才来结贴,不好意思

[Quote=引用 4 楼 wyjxhl97 的回复:]
[/Quote]
谢谢你的仔细回答,就是那么理解的
不过那个v字母不是少写了
而是CANDATA_bios[37][10]等同于vCANDATA_bios[37][10]
为什么这么写 我怕自己理解不清 说错了 就不说了
这些宏定义都是在不同的.h文件中定义的 我只是把相关的定义都罗列出来了


6楼的问题,让我有点哽咽了、、一时间也回答不上来 抱歉

另外,也谢谢7楼
xiaohuh421 2012-02-17
  • 打赏
  • 举报
回复
恭喜终于悟了
luopochengxuyuan 2012-02-17
  • 打赏
  • 举报
回复
已解决
论坛限制二十四小时内不能无满意答案结贴
下班前来结贴
回复的 都有分哈
mzlogin 2012-02-17
  • 打赏
  • 举报
回复
遇到宏多的。。。预编译工具是个好东西。。。
beveling 2012-02-17
  • 打赏
  • 举报
回复
楼主,我收回我的话额,其实我不是很懂……可否给我讲讲这个问题啊。我有两个疑问,第一,关于强制转换,它把CANDATA_bios这个二维数组转换成struct candata结构体型的,由于二维数组的空间比这个结构体大,它转换以后,那是不是把所有的二维数组空间都转换成结构体啊,还是只转换一个就行?第二,转换以后,原先的二维数组和转换之后的空间怎么对应的呢?谢谢……
beveling 2012-02-17
  • 打赏
  • 举报
回复
看是看的懂,但是说不清额……楼主有分不?
WYJXHL97 2012-02-17
  • 打赏
  • 举报
回复
#define ECCSMSG8 (*((struct eccsmsg8 *)(CANDATA[ECCSMSG8_DEF].DATA)))//这里是将ECCSMSG8定义地址CANDATA[14].DATA类型为eccsmsg8的结构

#define ECCSMSG8_DEF 14

struct candata
{
struct dataflg FLG;//这个结构不知道是什么样的,不过如果套你现在的结果这个结构应该是占一个byte
uchar8 COUNT;
uchar8 DATA[8];
};

#define CANDATA ((struct candata *)&vCANDATA_bios)//将CANDATA定义为地址是vCANDATA_bios类型为candata的结构

uchar8 vCANDATA_bios[37][10] ;//这里是不是打错了少了个字母v我加上了

struct eccsmsg8//这个结构就是一个位定义的结构总共占了8个byte
{
uchar8 DTCCODE_L; /* DT0 */
uchar8 DTCCODE_H; /* DT1 */
uchar8 ENSTNG :1; /* DT2 bit7 */
uchar8 ECMNG :1; /* DT2 bit6 */
uchar8 ETCNG :1; /* DT2 bit5 */
uchar8 FCNG :1; /* DT2 bit4 */
uchar8 CANNGF :1; /* DT2 bit3 */
uchar8 :1; /* DT2 bit2 */
uchar8 ECSMSG8C :2; /* DT2 bit1-0 */
uchar8 :8; /* DT3 */ /* [192]M */
uchar8 :8; /* DT4 */ /* [192]M */
uchar8 :6; /* DT5 bit7-2 */ /* [192]M */
uchar8 ISSAP :1; /* DT5 bit1 */ /* [192]M */
uchar8 SPTMD_LMP :1; /* DT5 bit0 */ /* [192]M */
uchar8 IDSTSTB :1; /* DT6 bit7 */ /* [192]M */
uchar8 IDSTSTS :1; /* DT6 bit6 */ /* [192]M */
uchar8 ISACT :1; /* DT6 bit5 */ /* [192]M */
uchar8 ISBRKREQ :1; /* DT6 bit4 */ /* [192]M */
uchar8 ISINDMD :2; /* DT6 bit3-2 */ /* [192]M */
uchar8 ISMSKSW :1; /* DT6 bit1 */ /* [192]M */
uchar8 CHRGLREQ :1; /* DT6 bit0 */ /* [192]M */
uchar8 SHARE_ECO_BOOST :8; /* DT7 */ /* [206]M */
}


这个宏定义顺序好像不对呀,不过大致分析了一下你的结构。
ECCSMSG8的地址起始位置就是&vCANDATA_bios[14][2];
ECCSMSG8.SHARE_ECO_BOOST是在起始位置偏移7个byte就是vCANDATA_bios[14][7]

70,023

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧