使用反射在 protobuf 中设置重复字段
setting repeated field in protobuf using reflection
我有一个类似的protobuf消息:
message foo {
repeated double values = 1;
}
我正在使用反射(如此处所述)在我的C++代码中设置这样的值
auto desc = protoMsg.GetDescription();
auto refl = protoMsg.GetReflection();
auto fd = desc->FindFieldByNumber(1); // run time value
assert(fd->is_repeated());
for (int i = 0; i < vect.size(); ++i)
refl->SetRepeatedDouble(&protoMsg, fd, i, vect[i]);
我的应用程序在函数SetRepeatedDouble
崩溃。以前有人尝试过做这样的事情吗?(使用反射设置值?请注意,由于应用程序的动态性质,我必须使用反射。我已经稍微简化了上面的代码,暂时不这样做)
此外,非常感谢有关如何调试此问题的任何提示。
SetRepeatedDouble()
覆盖数组中已经存在的元素。为了使您的代码正常工作,重复字段的大小必须至少等于 vect.size()
,否则您将溢出数组,这确实会导致崩溃(或更糟)。如果从空消息实例开始,则需要添加值而不是设置它们,如下所示:
for (int i = 0; i < vect.size(); ++i)
refl->AddDouble(&protoMsg, fd, vect[i]);
相关文章:
- 有没有办法在链接时设置精灵需要字段?
- 如何将必需的 protobuf 字段设置为其默认值?
- 无法从JNI设置Java Int数组字段
- 在模板专业化期间,如何设置C 结构中的静态字段
- 使用反射在 protobuf 中设置重复字段
- 在C 中以通用方式构建对象,设置字段并返回对象
- 使用父类构造函数初始化列表中的嵌套类字段中设置值
- C++使用成员字段设置比较器
- 构造函数将数组字段设置为 null
- 谷歌协议缓冲区,如何设置自定义类型的字段
- 如何在 CORBA 中获取和设置类字段?(处理 CORBA 对象的序列)
- 是否设置数组的某些字段,将其他字段设置为零
- 如何在 protobuf 中使用反射将预分配的消息设置为字段C++
- 如何使用模板设置联合的字段
- 如何通过派生类的方法复制来设置基类字段
- 在 C 中使用占位符设置字段宽度,并'char'
- 在谷歌协议缓冲区中设置重复字段时出错
- C++联合字段未正确设置
- 在C++中将默认参数设置为nullptr和非静态类字段
- CDHtmlDialog将焦点设置在输入字段上