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は同じデータがありません。

私は何か間違ったことをしていることを知っていますが、それを見つけることができません。

それが役立つ場合は、WindowsGCCでコードをコンパイルしています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* plistmemcpy のように使用しようとしています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

配列の場合、address-ofを渡す必要がないことに注意してください。ただやる

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

なぜこれがコンパイルされるのか混乱しています。それ以外の

typedef PIDs PId[28];

あなたが必要

typedef PId PIDs[28];

を使用して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 に答える