Как разыменовать член от структуры, в которой определение скрыто от пользователя? - PullRequest
0 голосов
/ 16 января 2019

Payload_Manager.h

typedef struct ATEIS_Payload_s* pATEIS_Payload;

Payload_Manager.c

#include "Payload_Manager.h"

struct __attribute__((__packed__))ATEIS_Payload_s   //payload
{
    uint32_t Addr;
    uint16_t Cmd;
    uint16_t Len;
    uint8_t Data[]; 
};

DNM_Manager.h

#include "Payload_Manager.h"

typedef struct DNM_s* pDNM;

pDNM DNMManager_Ctor(pDNM this, pATEIS_Payload src);

DNM_Manager.c

#include "Payload_Manager.h"

struct DNM_s
{
    uint32_t Addr;
    uint32_t SerialNo;
    uint32_t SubnetMask;
    uint16_t Tick;
    uint8_t Name[NAME_SIZE];
}DNMSet[SET_SIZE], DNMTemp;

pDNM DNMManager_Ctor(pDNM this, pATEIS_Payload src)
{
    memcpy(this->Name, &src->Data[NAME], NAME_SIZE);    //ptr to incomplete class type is not allowed
    this->Addr = src->Addr;    //ditto
    this->SerialNo = *(uint32_t*)&src->Data[SN];    //ditto
    this->SubnetMask = *(uint32_t*)&src->Data[SUBMASK];    //ditto
    this->Tick = 0;
    return this;
}

main.c

#include "Payload_Manager.h"
#include "DNM_Manager.h"

pDNM DNM_temp = NULL;
DNM_temp = DNMManager_New();    //get one DNM
DNM_temp = DNMManager_Ctor(DNM_temp, pl_p);    //init DNM_temp by pl_p

Файл DNM_Manager.c должен знать объявление ATEIS_Payload_s, иначе он не может разыменовать его.

Как я могу это сделать, кроме как снова объявить ATEIS_Payload_s в DNM_Manager.c?

Спасибо.

1 Ответ

0 голосов
/ 13 марта 2019

Как предложил Groo, разработчик должен предлагать пользователю функции для управления членами. Вот фрагмент из моего кода:

uint32_t PayloadManager_GetAddr(ATEIS_Payload_s* this)
{
    return this->Addr;
}
...