我需要设置以下结构并打印出 addr-array 的内容。
typedef struct
{
uint8 len;
uint8 ch;
uint8 cmd;
} ATTR_PACKED
RESPONSE_R;
typedef struct
{
RESPONSE_R rspr;
uint8 addr[SIZEOF_ADDR];
} ATTR_PACKED
RESPONSE_ADDR;
但是,我当前的解决方案是破坏变量周围的堆栈rspr
。据我所知,这是因为addr
是一个数组,我设置错了。但我不确定是否如此以及为什么。在调试器上它看起来没问题,直到我在退出函数时收到错误消息。
//this code has to be ansi-c
void OnResponse(uint8 *pPkt){
RESPONSE_R rspr;
//pPkt[0] holds the lenght of the received response, which equals to sizeof(rspadr)
//before this was ok, but I guess, now it is not, because RESPONSE_R stores just the
//pointer, not the whole array
memcpy(&rspr,pPkt,pPkt[0]-sizeof(rspr));
switch(rspr.cmd){
case CMD_READ_ADDR:
RESPONSE_ADDR rspadr;
memcpy(&rspadr,pPkt,pPkt[0]);
//nevermind the cout, this is for debug only
cout << "ADDR: " << endl;
printf("%02x",rspadr.addr[0]);
break;
default:
break;
}
}
rspadr
获取正确的数据,那么为什么我要用这段代码破坏我的堆栈呢?
编辑
memcpy
用于pPkt
确定大小,因为pPkt[0]
保存传输的响应字节的大小。但也许这里有一点,我应该将其更改为直接使用结构大小。但是 - 这不是这里的主要问题。
pPkt[]
主要的麻烦制造者是,当这些结构之一有一个数组时,我如何将缓冲区中的数据转换为我的结构,比如 RESPONSE_ADDR 有?
pPkt[128]
数组的原始视图
[0x0] = 0x09
[0x1] = 0x00
[0x2] = 0x02
[0x3] = 0x00
[0x4] = 0x16
[0x5] = 0x01
[0x6] = 0x02
[0x7] = 0x03
[0x8] = 0x04
[0xa] = 0x00
[0xb] = 0x00
[0xc] = 0x00
...
[0x127] = 0x00
以上是我得到的输入。现在,我需要设置一个RESPONSE_R
对象,以便选择由该cmd
部分确定的例程(由 pPkt[2] 表示)和一个RESPONSE_ADDR
对象以获取地址,即001601020304
.
我非常希望能够使用类似rsp.cmd
and的东西rspadr.addr[0]
。