2

我读过这个这个这个,但没有一个回答我想知道的

一组 PId(每个 3 个字节)从保存到原始数组 ( buffer) 中的硬件返回。该设备准确返回 84 个字节。

然后我需要将这些 PId 复制到一个或多个数组,该数组可由该设备的 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有正确的数据,但之后memcpypids没有相同的数据。

我知道我做错了什么,但我找不到。

如果有帮助,我正在用 Windows 编译我的GCC代码ARM CPU

编辑:我很抱歉让大家感到困惑,实际上代码是有效的,但是我错过了一部分代码。我更正了。 pids不是类型PIDs,它是指向它的指针。

4

4 回答 4

3

看看这个问题的答案。您可能不想typedef直接使用 s 数组。

尝试这样的事情:

声明:

#pragma pack (1)

typedef struct PId
{
    unsigned char pid[3];
} PId;


typedef struct PIDs
{
    PId pids[28];
} PIDs;

然后,对于 memcpy...

其他人指出您正在传递指针,例如PId* plist,但您正在尝试使用 memcpy like memcpy(&plist, buffer, 84);。该&符号会让您感到困惑,因为它会引用指针本身的地址。你想要的是:

//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
}
于 2012-10-31T03:30:48.800 回答
2

请注意,对于数组,您不需要传递地址。做就是了

memcpy(pids, buffer, 84);
于 2012-10-31T04:25:24.287 回答
0

我很困惑为什么这甚至可以编译。代替

typedef PIDs PId[28];

你需要

typedef PId PIDs[28];

使用 a typedef,您将新类型的名称放在变量通常所在的位置。

于 2012-10-31T02:46:16.087 回答
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);
}
于 2012-10-31T03:05:17.557 回答