我有一条类似于此的protobuf消息:
message foo {
repeated double values = 1;
}
我正在使用反射(如here所述)在我的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
函数内崩溃。以前有人试过这样的事吗? (使用反射设置值?请注意,由于我的应用程序的动态特性,我必须使用反射。我已经简化了上面的代码,暂时没有这样做)
此外,有关如何调试此功能的任何提示均表示赞赏。
答案 0 :(得分:3)
SetRepeatedDouble()
会覆盖数组中已存在的元素。为了使您的代码工作,重复字段的大小必须至少等于vect.size()
,否则您将超出阵列,这确实会导致崩溃(或更糟)。如果您开始使用空消息实例,则需要添加值而不是设置它们,如下所示:
for (int i = 0; i < vect.size(); ++i)
refl->AddDouble(&protoMsg, fd, vect[i]);