首先,我對C++並不是很有經驗,所以也許我在這裏監督着某些東西。 我試圖動態生成的protobuf用下面的代碼從.proto文件的消息:動態生成protobuf消息並返回指向它的指針
int init_msg(const std::string & filename, protobuf::Arena* arena, protobuf::Message** new_msg){
using namespace google::protobuf;
using namespace google::protobuf::compiler;
DiskSourceTree source_tree;
source_tree.MapPath("file", filename);
MuFiErCo error_mist;
Importer imp(&source_tree, &error_mist);
printf("Lade Datei:%s \n", filename.c_str());
const FileDescriptor* f_desc = imp.Import("file");
const Descriptor* desc = f_desc->FindMessageTypeByName("TestNachricht");
const Message* new_msg_proto = dmf.GetPrototype(desc);
*new_msg = new_msg_proto->New(arena);
//Debug
cout << (*new_msg)->GetTypeName() << endl;
return 0;
}
int main(int argc, char* argv[]){
protobuf::Arena arena;
protobuf::Message *adr2, *adr1;
init_msg("schema-1.proto", &arena, &adr1);
init_msg("schema-1.proto", &arena, &adr2);
printf("MSG_Pointer: %p, %p\n", adr1, adr2);
cout << adr1->GetTypeName() << endl;
arena.Reset();
return 0;
}
我想如果我使用競技場,新的信息也可從功能範圍之外。 但是,如果我嘗試訪問消息,總會有一個段錯誤。 我想這是一個簡單的錯誤,但我無法弄清楚,如何解決這個問題。
這裏是輸出中:
Lade Datei:schema-1.proto
packet.TestNachricht
Lade Datei:schema-1.proto
packet.TestNachricht
MSG_Pointer: 0x1b293b0, 0x1b287f0
Speicherzugriffsfehler (Speicherabzug geschrieben)
這個問題,我認爲,是'FileDescriptor'等被破壞的時候'init_msg'回報,使新創建的消息,沒有辦法詢問其.proto定義。您需要將'Importer'實例移動到'main'並保持活動狀態。這與競技場無關。 –
這就是解決方案,我將在稍後提供一個工作代碼示例。 非常感謝! – LoopingLouie