将 void* 转换为结构
casting void* to struct
我知道有人问过类似的问题,但我无法从中找出答案。
现在我有一些特定的结构和一个带有'''void*'''的通用结构问题取决于函数中的给定参数当我尝试访问结构编译器中的成员时,我应该将这个通用指针转换为指向结构的指针不接受这个
我想returnstruct 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 */
}
}
具体问题是你访问的还是void指针而不是struct指针造成的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 ;
}
}
我知道有人问过类似的问题,但我无法从中找出答案。 现在我有一些特定的结构和一个带有'''void*'''的通用结构问题取决于函数中的给定参数当我尝试访问结构编译器中的成员时,我应该将这个通用指针转换为指向结构的指针不接受这个
我想returnstruct 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 */
}
}
具体问题是你访问的还是void指针而不是struct指针造成的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 ;
}
}