我看过this,this和this,但没有一个能回答我想知道的内容
从硬件返回一组PId(每个3个字节),该硬件保存到原始数组(buffer
)中。该设备正好返回84个字节。
然后我需要将这些PI ID复制到一个或多个数组,这个数组可以被这个设备的API库读取。
这是我的代码
#pragma pack (1)
typedef unsigned char PId[3];
typedef PId PIDs[28];
int GetList(PId* plist){
unsigned char buffer[84];
//... Reads the data from hardware memory to buffer
if (RunCMD(0xCD, &buffer)){
// buffer has the correct data now 'AAAA...'
memcpy(&plist,buffer, 84);
printf("%02X%02X%02X\n", buffer[0], buffert[1], buffer[2]);
printf("%02X%02X%02X\n", buffer[3], buffer[4], buffer[5]);
return 0;
}
return 1;
}
int main(void) {
...
PId plist_a;
GetList(&plist_a);
printf("%02X%02X%02X\n", plist_a[0][0], plist_a[0][1], plist_a[0][2]);
printf("%02X%02X%02X\n", plist_a[1][0], plist_a[1][1], plist_a[1][2]);
...
}
不知何故,此代码不会将正确的数据复制到PIDs
数组。 buffer
拥有正确的数据,但在memcpy
之后,pids
没有相同的数据。
我知道我做错了但我找不到。
如果有帮助,我正在使用GCC
ARM CPU
个窗口编译我的代码
编辑:我为让每个人感到困惑道歉,实际上代码工作正常,但我错过了部分代码。我纠正了。 pids
不是PIDs
类型,它是指向它的指针。
答案 0 :(得分:3)
看看the answer to this question。您可能不希望直接使用typedef
个数组。
尝试这样的事情:
声明:
#pragma pack (1)
typedef struct PId
{
unsigned char pid[3];
} PId;
typedef struct PIDs
{
PId pids[28];
} PIDs;
然后,对于memcpy ......
其他人已经指出你正在传递指针,例如PId* plist
,但你正在尝试使用像memcpy(&plist, buffer, 84);
这样的memcpy。 &
符号会让你感到困惑,因为它会引用指针本身的地址。你想要的是:
//plist should probably be a pointer to PIDs, not PId
int GetList(PIDs* plist){
unsigned char buffer[84];
//... Reads the data from hardware memory to buffer
if (RunCMD(0xCD, &buffer)){
// buffer has the correct data now 'AAAA...'
//remove the & symbol
memcpy(plist,buffer, 84);
//etc
}
答案 1 :(得分:2)
请注意,对于数组,您不需要传递地址。只是做
memcpy(pids, buffer, 84);
答案 2 :(得分:0)
我很困惑,为什么这甚至编译。而不是
typedef PIDs PId[28];
你需要
typedef PId PIDs[28];
使用typedef
,您可以将新类型的名称放在变量通常所在的位置。
答案 3 :(得分:0)
这可能有效:
#pragma pack (1)
struct PId{
unsigned char pid[3];
};
int main(){
unsigned char buffer[84];
struct PId pids[28];
/* buffer gets populated somewhere here */
memcpy(pids, buffer, 84);
}