приведение void * к структуре - PullRequest
0 голосов
/ 12 марта 2020

Я знаю, что почему-то был задан похожий вопрос, но я не мог найти ответ на него. Теперь у меня есть некоторые специфические c sturcts и одна обобщенная c структура с '' 'void *' '', проблема в том, что в зависимости от заданного параметра в функции я должен привести этот обобщенный c указатель на указатель на структуру, когда Я пытаюсь получить доступ к членам в struct compiler, но не принимает

Я хочу вернуть struct gen, совмещая данные примера struct a или struct b

код

typedef enum
{
    chooseA = 0,
    chooseB = 1,

} chooseVal;

typedef struct
{
    uint16_t x1;
    uint8_t  x2;
    uint8_t* x3;
} a;

typedef struct
{
    uint16_t y1;
    uint8_t  y2;
    uint8_t* y33;
} b;

typedef struct
{
    chooseVal z;
    void* object;
} gen;

void readStruct(gen* out, uint16_t val, uint16_t X1)
{
    out->z==val;
    if(out->z==chooseA)
    {
        a* A;
        A=(a*)out->object;
        out->object->x1 = X1;/*This is the not working line */
    }
}

1 Ответ

0 голосов
/ 12 марта 2020

Указанная проблема c вызвана тем, что вы по-прежнему обращаетесь к пустому указателю вместо структурного указателя A. Вся причина, по которой вы создали A, должна быть для этой цели, поэтому просто сделайте A->x1 = X1;.

Однако, это излишне сложно. Поскольку обе структуры имеют одинаковые члены и просто разные имена переменных, это идеальный случай для union, что означает, что члены структуры могут быть размещены вместе с перечислением, а не где-то еще. Со стандартным C вы можете сделать это:

typedef enum { A, B } choose_val_t;

typedef union
{
  struct
  {
    uint16_t x1;
    uint8_t  x2;
    uint8_t* x3;
  };
  struct
  {
    uint16_t y1;
    uint8_t  y2;
    uint8_t* y3;
  };
} ab_t;

typedef struct
{
  choose_val_t val;
  ab_t ab;
} gen_t;

void readStruct(gen_t* out, choose_val_t val, uint16_t X1)
{
  out->val = val;
  switch(val)
  {
    case A: out->ab.x1 = X1; return ;
    case B: /* something */  return ;
  }
}
...