OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4740|回复: 10

深夜没搞懂结构体里面的void * p发个帖子明天等答案

[复制链接]

31

主题

130

帖子

0

精华

高级会员

Rank: 4

积分
790
金钱
790
注册时间
2015-6-28
在线时间
139 小时
发表于 2016-7-13 01:10:56 | 显示全部楼层 |阅读模式
1金钱
[mw_shl_code=c,true]#pragma pack(1)
typedef struct CardInfo
{
        unsigned char Card[5];       
}CARD_INFO,*pCARD_INFO;

typedef struct         PackInfo
{
        char                SyncHead[4];
        void                *pData;
        unsigned short        CrcValue;
}PACK_INFO,*pPACK_INFO;

#pragma pack()
pPACK_INFO PACK_A;
CARD_INFO PACK_B;
//现在想,PACK_A  里面的pData位置填上PACK_B的实际数据
unsigned short len;//结构体 PACK_A 在填了数据之后的最终长度[/mw_shl_code]搞了好久了没搞明白。在这个pData位置我一直是取得地址,但是没有得到数据。。已经蒙了。

最佳答案

查看完整内容[请看2#楼]

void*型就是空指针,你爱指啥指啥,需要得到的数据只需要取地址然后强转成void* 型就OK 万事大吉!这种方法在linux底层驱动和内核中非常常见!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

5

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
104
金钱
104
注册时间
2016-2-18
在线时间
13 小时
发表于 2016-7-13 01:10:57 | 显示全部楼层
void*型就是空指针,你爱指啥指啥,需要得到的数据只需要取地址然后强转成void* 型就OK 万事大吉!这种方法在linux底层驱动和内核中非常常见!
回复

使用道具 举报

31

主题

130

帖子

0

精华

高级会员

Rank: 4

积分
790
金钱
790
注册时间
2015-6-28
在线时间
139 小时
 楼主| 发表于 2016-7-13 09:14:47 | 显示全部楼层
木有人看一下嘛
回复

使用道具 举报

36

主题

256

帖子

0

精华

高级会员

Rank: 4

积分
921
金钱
921
注册时间
2016-4-20
在线时间
169 小时
发表于 2016-7-13 09:36:43 | 显示全部楼层
         这个是一种数据流的处理办法。网络传输数据包用的比较多。SyncHead这个是包头,后面定义成void类型可扩展性好,最后应该是个crc校验。因为这段报文长度实际不知道的。需要填充后得到。我举个例子吧,我组装了两个数据包pack1 pack2  。*pdata的len是4和6,地址分别取自data1和data2两个数组那么形式如下。         uint32_t  data1[4] = {xxx1  xxx2  xxx3  xxx4  };   
         uint32_t  data2[6] = {xxx1  xxx2  xxx3  xxx4  xxx5  xxx6 };
         数据包是这样:
           SyncHead               void   *pdata                                                               crc
pack1: 0000                     xxx1  xxx2  xxx3  xxx4                                                3745
pack2: 0001                     xxx1  xxx2  xxx3  xxx4  xxx5  xxx6                               5251
          你这个时候取padata->pdata指向就是  32位数组data1或者data2了。但是此时你的结构体的指针是void类型的所以你要转下指针类型才能得到数据。比如你要得到data1[2]数据就要这么写。

           ((uint32_t *)&(padata->pdata) +2)  
           大概就是这样的。
          其实c语言里面像memcpy这样的内存拷贝函数都是void *定义指针的,楼主可以看看。
回复

使用道具 举报

31

主题

130

帖子

0

精华

高级会员

Rank: 4

积分
790
金钱
790
注册时间
2015-6-28
在线时间
139 小时
 楼主| 发表于 2016-7-13 09:44:53 | 显示全部楼层
czdspeed 发表于 2016-7-13 09:36
这个是一种数据流的处理办法。网络传输数据包用的比较多。SyncHead这个是包头,后面定义成void类 ...

不是这样吧,((uint32_t *)&(padata->pdata) +2) , 你这个不是应该是先&取得pdata的地址,而这个pdata本来是一个指针,你&这个指针是获得的是指针变量的地址吧。
回复

使用道具 举报

36

主题

256

帖子

0

精华

高级会员

Rank: 4

积分
921
金钱
921
注册时间
2016-4-20
在线时间
169 小时
发表于 2016-7-13 09:53:09 | 显示全部楼层
恩,定义确实是个指针。不过->是引用内容吧。然后再取地址转化指针类型。好像没错吧。我没有代码,楼主可以自己调试下看看。
回复

使用道具 举报

31

主题

130

帖子

0

精华

高级会员

Rank: 4

积分
790
金钱
790
注册时间
2015-6-28
在线时间
139 小时
 楼主| 发表于 2016-7-13 10:20:17 | 显示全部楼层
天涯歌戮 发表于 2016-7-13 10:01
void*型就是空指针,你爱指啥指啥,需要得到的数据只需要取地址然后强转成void* 型就OK 万事大吉!这种方法 ...

void是没有类型的指针,不是说是空指针
回复

使用道具 举报

60

主题

409

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2814
金钱
2814
注册时间
2012-10-17
在线时间
653 小时
发表于 2016-7-13 17:50:00 | 显示全部楼层
有幫PACK_A分配空間嗎?  
unsigned short len;//结构体 PACK_A 在填了数据之后的最终长度
這句話是啥意思....結構大小怎麼可能還會改變...


        PACK_B.Card[2] = 60;
        PACK_B.Card[3] = 80;
        PACK_B.Card[4] = 100;

        PACK_A = (pPACK_INFO)malloc(sizeof(PACK_INFO));
        PACK_A->pData =(void *) &PACK_B;
       
        printf("%d\n", ((unsigned char *)PACK_A->pData)[2]);
        printf("%d\n", ((unsigned char *)PACK_A->pData)[3]);
        printf("%d\n", ((unsigned char *)PACK_A->pData)[4]);
回复

使用道具 举报

31

主题

130

帖子

0

精华

高级会员

Rank: 4

积分
790
金钱
790
注册时间
2015-6-28
在线时间
139 小时
 楼主| 发表于 2016-7-13 19:22:06 | 显示全部楼层
civic7366 发表于 2016-7-13 17:50
有幫PACK_A分配空間嗎?  
unsigned short len;//结构体 PACK_A 在填了数据之后的最终长度
這句話是啥意思 ...

我这是在STM32平台写的,你这个应该是C++的吧,而且这个(void *) &PACK_B本来是有类型的你还可以强制转到无类型的?
回复

使用道具 举报

60

主题

409

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2814
金钱
2814
注册时间
2012-10-17
在线时间
653 小时
发表于 2016-7-15 09:31:43 | 显示全部楼层
本帖最后由 civic7366 于 2016-7-15 09:33 编辑

我是在VC++打的 但都是C阿...哪段在STM32不能用?
printf 原子不是有提供UART輸出...
而且用debug mode也不需要輸出 直接看memory就能知道對不對了
回复

使用道具 举报

31

主题

130

帖子

0

精华

高级会员

Rank: 4

积分
790
金钱
790
注册时间
2015-6-28
在线时间
139 小时
 楼主| 发表于 2016-7-15 09:42:25 | 显示全部楼层
civic7366 发表于 2016-7-15 09:31
我是在VC++打的 但都是C阿...哪段在STM32不能用?
printf 原子不是有提供UART輸出...
而且用debug mode也 ...

我已经想到并且实现了,但是我觉得你那个printf哪里应该是有问题的。我没试纯属看的,别介意
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 08:47

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表