【发布时间】:2019-10-11 11:02:57
【问题描述】:
我目前使用的日志系统使用标签值来识别它将存储的参数。我们使用的格式如下: 标签+时间+价值。
下一步是获取记录的消息并使用协议缓冲区将其发送到服务器以序列化数据。
protocol buffer .proto 文件,提供了一个结构体,所有字段对应于原始日志系统中的一个标签。
当我需要有效地读取标签并将值分配给协议缓冲区结构中的字段时,问题就出现了。本质上,我想例如接受标签 5 并能够在结构中找到字段 5 并写入值。
我知道这可以通过 switch case 来完成,但是我们使用了大约 50 个标签,所以我想尽可能避免使用这种解决方案。我附上一个示例结构来说明问题。
/* Struct definitions */
typedef struct _Profiles {
int32_t param1;
int32_t param2;
int32_t param3;
int32_t param4;
int32_t param5;
int16_t param6;
int32_t param7;
uint32_t param8;
int32_t param9;
int32_t param10;
uint32_t param11;
int32_t time;
/* @@protoc_insertion_point(struct:Profiles) */
} Profiles;
预期的结果是我可以存储如下记录的行: 5 1345643 1500(标签、时间、值)
到一个协议缓冲区结构:
profiles.param5 = 1500
profiles.time = 1345643
不需要 12 个 switch case(在这个例子中)。基本上,如何使用整数/枚举访问结构的第 5 个声明字段。
请记住,结构的每个字段都可能具有不同的类型。
【问题讨论】:
-
为什么你有成员
param1..param10而不是数组int32_t param[10]?或者名称是说明性的。 -
在这个问题中,它们确实是说明性的,并且可能具有不同的类型。