gpt4 book ai didi

C 中的条件结构类型

转载 作者:行者123 更新时间:2023-12-03 03:37:43 35 4
gpt4 key购买 nike

我只想解析一些可以以两种类型之一存在的数据。第一个是

struct typeA {
int id,
char name[16],
int value1,
int value2,
int value3,
int value4
} __attribute__ ((packed));

第二种可能是数据具有双倍名称长度的形式

struct typeB {
int id,
char name[32],
int value1,
int value2,
int value3,
int value4
} __attribute__ ((packed));

到目前为止一切顺利。现在我有两个函数可以解析这两个

int parse_typeA(struct typeA *x){ /* do some stuff */ }
int parse_typeB(struct typeB *x){ /* do some stuff */ }

现在,如果您有更多类型,这显然是不切实际的。如何使用一个函数和一个附加参数(如

)来实现两种类型的解析
int parse_any_type(void *x, int type){ 
/*
* WHAT TO DO HERE ??
*
* The following doesn't work
*
* if(type == 1)
* struct typeA *a = (struct typeA *)x;
* else
* struct typeB *a = (struct typeB *)x;
*/
printf("%i\n", a->id);
printf("%s\n", a->name);
printf("%i\n", a->value1);
printf("%i\n", a->value2);
printf("%i\n", a->value3);
printf("%i\n", a->value4);
}

有人有什么想法吗?

最佳答案

这取决于您的解决方案必须有多通用。正如其他答案所指出的,这两个示例结构非常相似,因此可以相对容易地管理(尽管决定如何确定字符串的结尾会出现一些问题)。

如果您需要更通用的系统,您可能需要查看某种传递给转换器的“结构描述符”字符串,或者可能是“结构描述符数组”。

例如,字符串可能是:

"i s16 i i i i"  // typeA
"i s32 i i i i" // typeB

"u32 i64 z d d" // struct { uint32_t a; int64_t b; size_t c; double d; double e; };

int parse_any_type(void *output, const char *desc);

然后,您必须处理一些对齐和填充问题,但是(只要您获得正确的描述符字符串)您可以编写一个例程来处理该批处理(打包或未打包)。

使用“描述符”,您可能会处理 C 中不太知名的宏之一,offsetof宏定义于 <stddef.h> 。您可以创建一个描述符类型,例如:

enum Type { CHAR, UCHAR, SCHAR, STR, USTR, SSTR, SHORT, USHORT, INT, UINT, LONG, ULONG, ... };
struct descriptor
{
enum Type m_type; // Code for the variable type
size_t m_size; // Size of type
size_t m_offset; // Offset of variable in structure
};

struct descriptor d_TypeA[] =
{
{ INT, sizeof(int), offsetof(TypeA, id) },
{ STR, 16, offsetof(TypeA, name) },
{ INT, sizeof(int), offsetof(TypeA, value1) },
{ INT, sizeof(int), offsetof(TypeA, value2) },
{ INT, sizeof(int), offsetof(TypeA, value3) },
{ INT, sizeof(int), offsetof(TypeA, value4) },
};

然后,您可以将适当的类型描述符数组(以及该数组的大小)以及指向数据存储位置的指针传递给该函数。

您可以使用指向正确转换器的函数指针类型,而不是使用枚举。

int parse_structure(void *output, const struct descriptor *desc, size_t n_desc);

另一种选择是,您只需使用适当的函数来处理每种类型,该函数调用其他更简单的函数来处理结构的每个部分。

int parse_TypeA(TypeA *output)
{
if (parse_int(&output->id) == 0 &&
parse_str(output->name, 16) == 0 &&
parse_int(&output->value1) == 0 &&
parse_int(&output->value2) == 0 &&
parse_int(&output->value3) == 0 &&
parse_int(&output->value4) == 0)
return 0;
...diagnose error...
return -1;
}

您的示例没有明确指出数据来自何处,而不是数据的存储位置。这可能并不重要,但会影响解决方案。在没有参数的情况下,期望从标准输入读取数据可能是合理的。或者,您可能有一个包含要解析的数据的字符串,也可能具有长度;这些将是函数的参数。

您的示例没有说明错误处理;调用代码如何知道转换是否成功。

如果操作正确,相同的描述机制可以用于解析和打印机制 - 您的 parse_any_type()函数看起来更像是打印函数。

<小时/>

另请参阅

关于C 中的条件结构类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8262390/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com