3

私はこれらの3つの構造を持っています、

typedef struct serial_header {
    int zigbeeMsgType;
    int seqNumber;
    int commandIdentifier;
    int dest;
    int src;
}serial_header_t;


typedef struct serial_packet {
  serial_header_t header;
  int data[];
} serial_packet_t;

そして最後は

typedef struct readAttributePacket
{
     int                     u8SourceEndPointId;
     int                     u8DestinationEndPointId;
     int                     u16ClusterId;
     int                     bDirectionIsServerToClient;
     int                     u8NumberOfAttributesInRequest;
     int                     bIsManufacturerSpecific;
     int                     u16ManufacturerCode;
     int                     pu16AttributeRequestList[];
}readAttributePacket_t;

私はこのコードで問題を抱えています。serial_packet_tにあるdata[]配列をreadAttributePacket_t構造体にキャストしたいだけです。data[]は

data[]={0x01,0x01,0x04,0x02,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x01};

これらのデータをreadAttributePacket_t構造体にキャストする必要があります。しかし、以下のコードは間違っていることを示しています。

void main()
{
int a[]=  {0x32,0x00,0x31,0x69,0x69,0x00,0x00,0x01,0x01,0x04,0x02,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x01};
int i;
readAttributePacket_t *p;
serial_packet_t *data;

data = (serial_packet_t*)&a;

for(i=0;i<20;i++){
    printf(" %02x \n",a[i]);
}
p = (readAttributePacket_t *)&data->data;
printf("\nu8SourceEndPointId:%x \nu8DestinationEndPointId:%x \nu16ClusterId:%04x \nbDirectionIsServerToClient:%x \nu8NumberOfAttributesInRequest:%x \nbIsManufacturerSpecific:%x \nu16ManufacturerCode:%04x",p->u8SourceEndPointId,
    p->u8DestinationEndPointId,
    p->u16ClusterId,
    p->bDirectionIsServerToClient,
    p->u8NumberOfAttributesInRequest,
    p->bIsManufacturerSpecific,
    p->u16ManufacturerCode);


getch();
}

出力は次のようになります

u8SourceEndPointId=01
u8DestinationEndPointId=01
u16ClusterId=0402
bDirectionIsServerToClient=00
u8NumberOfAttributesInRequest=02
bIsManufacturerSpecific=00
u16ManufacturerCode=0000

どうすればpu16AttributeRequestList[]配列をreadAttributePacket_t構造体に入れることができますか?

pu16AttributeRequestList[0]=0000
pu16AttributeRequestList[1]=0001
4

2 に答える 2

7

配列は単に互換性のない型であるため、配列を構造体にキャストすることはできません。メモリアライメントの制約により、コンパイラは構造体のフィールド間にパディングを挿入する必要があるため、メンバーは予想されるメモリアドレスに配置されません。ソリューション:

  1. ポータブルですが、手動で行うのが遅い/難しい(推奨):構造体のフィールドを手動で配列にコピーします。
  2. 記述は短くなりますが、GCC固有です。__attribute__((packed))キーワードを使用して、GCCが構造体フィールド間にパディングを導入しないようにします。
于 2012-07-13T12:09:59.587 に答える
0

3つの構造体の和集合を構築します。すべて同じメモリスペースにあります。その後、キャストする必要はありません。

于 2012-07-13T12:37:23.330 に答える