标题:火火火-结构指针访问指针成员出错
只看楼主
HAHA66
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2018-10-22
结帖率:0
已结贴  问题点数:20 回复次数:14 
火火火-结构指针访问指针成员出错

typedef struct{
  byte Head;
  byte Length;
  byte Cmd;  
  byte *Data;
  byte *End1;
  byte *End2;
  byte *End3;
}SturctComData;


uint8_t TxBuf[20] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06,0x07};
void TestStructPoint(void)
{     
  SturctComData *tDataCom = (SturctComData*)TxBuf;

  tDataCom->Data = &tDataCom->Cmd + 1; //这里完成指针的初始化
  tDataCom->End1 = tDataCom->Data + tUartCom->Length;  
  tDataCom->End2 = tDataCom->End1 + 1;
  tDataCom->End3 = tDataCom->End2 + 1;

  tDataCom.Head = 0x66;
  tDataCom.Length = 0x07;
  tDataCom.Cmd = 0x01;

  for(i=0; i<Len; i++)
  {
    *tUartCom ->Data ++  = *Data++; //????????前面已经将Data指针指向了TxBuf的TxBuf[03],为何这里会出错,请高手指点?
  }  
}
问题点如问号所处所描述,请高手指点,谢谢!
搜索更多相关主题的帖子: 结构 指针 出错 byte Data 
2018-10-22 15:31
HAHA66
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2018-10-22
得分:0 
怎么无人问鼎?我在线等呢,请高手赐教,谢谢!
2018-10-22 15:56
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:10 
*tUartCom ->Data ++  = *Data++; 这里的*Data++的Data是什么?
2018-10-22 15:57
HAHA66
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2018-10-22
得分:0 
回复 3楼 吹水佬
这个是函数参数传进来的指针,我的初衷是数组发送和接受数据,这样很多地方都用到数组的下标访问,麻烦的很也不好更改和维护,所以一接收数据,我想将接收到的数组数据映射成结构体,这样访问多方便啊。
 但是这个数据长度是变化的,格式是Head+Length+CMD+Data+....这里的Data的长度是变化的,可能是10个字节20个字节

[此贴子已经被作者于2018-10-22 16:16编辑过]

2018-10-22 16:12
HAHA66
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2018-10-22
得分:0 
各位高手这个问题出在哪里?或者有解决这个问题的办法请讲讲,谢谢!
2018-10-22 16:28
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
看不明白具体是做什么
最好给个可运行测试的示例
2018-10-22 16:33
HAHA66
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2018-10-22
得分:0 
typedef struct{
   byte Head;
   byte Length;
   byte Cmd;  
   byte *Data;
   byte *End1;
   byte *End2;
   byte *End3;
 }SturctComData;


我的目的很明确,比如我接收的一组数据到数组 uint8_t Rx[20] = {0x01,0x05,0x03,0x04,0x06,0x07,0x99};

这个时候我接收到数据后要对数据进行分析处理,那么下面要访问数据,就要对数据进行分解,第一个字节代表数据头,
第二个代表数据长度Length,第三个代表命令Cmd,后面以此类推,这个如果如果不把他映射到结构体,那么访问的时候
就是 if(Rx[0] == 0X01)
     {
     }

如果映射到结构体那么就是
      SturctComData *tDataCom = (SturctComData*)Rx;
      这个时候访问的时候就是
      if(tDataCom.Head == 0X01)
      {
      }
因为数据的长度不是定长的,那么我应该怎么做到这个效果,按照我最开始的在复制结构成员的时候就会出错
SturctComData *tDataCom = (SturctComData*)TxBuf;

 tDataCom->Data = &tDataCom->Cmd + 1; //这里完成指针的初始化
 tDataCom->End1 = tDataCom->Data + tUartCom->Length;  
 tDataCom->End2 = tDataCom->End1 + 1;
 tDataCom->End3 = tDataCom->End2 + 1;

 tDataCom.Head = 0x66;
 tDataCom.Length = 0x07;
 tDataCom.Cmd = 0x01;

 for(i=0; i<Len; i++)
 {
   *tUartCom ->Data ++  = *Data++; //????????前面已经将Data指针指向了TxBuf的TxBuf[03],为何这里会出错,请高手指点?
 }
2018-10-22 16:46
HAHA66
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2018-10-22
得分:0 
回复 6楼 吹水佬
typedef struct{
   byte Head;
   byte Length;
   byte Cmd;  
   byte *Data;
   byte *End1;
   byte *End2;
   byte *End3;
 }SturctComData;


我的目的很明确,比如我接收的一组数据到数组 uint8_t Rx[20] = {0x01,0x05,0x03,0x04,0x06,0x07,0x99};

这个时候我接收到数据后要对数据进行分析处理,那么下面要访问数据,就要对数据进行分解,第一个字节代表数据头,
第二个代表数据长度Length,第三个代表命令Cmd,后面以此类推,这个如果如果不把他映射到结构体,那么访问的时候
就是 if(Rx[0] == 0X01)
     {
     }

如果映射到结构体那么就是
      SturctComData *tDataCom = (SturctComData*)Rx;
      这个时候访问的时候就是
      if(tDataCom.Head == 0X01)
      {
      }
因为数据的长度不是定长的,那么我应该怎么做到这个效果,按照我最开始的在复制结构成员的时候就会出错
SturctComData *tDataCom = (SturctComData*)TxBuf;

 tDataCom->Data = &tDataCom->Cmd + 1; //这里完成指针的初始化
 tDataCom->End1 = tDataCom->Data + tUartCom->Length;  
 tDataCom->End2 = tDataCom->End1 + 1;
 tDataCom->End3 = tDataCom->End2 + 1;

 tDataCom.Head = 0x66;
 tDataCom.Length = 0x07;
 tDataCom.Cmd = 0x01;

 for(i=0; i<Len; i++)
 {
   *tUartCom ->Data ++  = *Data++; //????????前面已经将Data指针指向了TxBuf的TxBuf[03],为何这里会出错,请高手指点?
 }
2018-10-22 16:47
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
结构是不变的,只是data指针指向的数据区大小变动
知道data指针和数据区大小变可以
2018-10-22 17:00
HAHA66
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2018-10-22
得分:0 
回复 9楼 吹水佬
SturctComData *tDataCom = (SturctComData*)TxBuf;我在这里做了一个强制转换,关键是赋值到结构成员指针怎么就不对了,请帮我试试是哪里的问题。而且我的这个是不带操作系统的,ARM裸奔程序,不能用new来做,谢谢

[此贴子已经被作者于2018-10-22 17:04编辑过]

2018-10-22 17:03



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-490596-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.155046 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved