2017-02-01 97 views
1

我有一個類似的protobuf的消息中設置在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功能。有沒有人試圖做過這樣的事情? (使用反射設置值?請注意,由於我的應用程序的動態性質,我必須使用反射。我已經簡化了上面的代碼,稍後暫時不這樣做)

還有關於如何可能調試的任何提示,敬請期待。

回答

2

SetRepeatedDouble()覆蓋已存在的數組元素。爲了使代碼正常工作,重複的字段必須已經具有至少等於vect.size()的大小,否則您將超出數組,這確實會導致崩潰(或更糟糕)。如果你開始一個空消息實例,那麼你需要添加的值,而不是將它們設置,就像這樣:

for (int i = 0; i < vect.size(); ++i) 
    refl->AddDouble(&protoMsg, fd, vect[i]); 
+0

謝謝!這雖然略顯不直觀。文檔中說的是: - 可能的錯誤來源: - 在重複字段上調用奇異字段的Get *()或Set *()方法。 - 在非重複字段上調用GetRepeated *(),SetRepeated *()或Add *()。 – skgbanga