2016-10-08 60 views
-1

我有一個消息,看起來像:在消息發佈谷歌Protobuf3多個字符​​串

message Connected { 
    sint32 xloc = 1; // x spawn world position 
    sint32 yloc = 2; // y spawn world position 
    sint32 zrot = 3; // z spawn rotation 
    string sector = 4; // sector name (unsure about this) 
    string name = 5; // player name 
    string pid = 6; // player id 
    string scolor = 7; // ship color 
    string sname = 8; // ship name 
} 

我試圖我的C++這樣的代碼中初始化:

server::player::Connected connectMessage; // send this to this joining client 
connectMessage.set_name("clientName"); 
connectMessage.set_pid("clientId"); 
connectMessage.set_scolor("shipColor"); 
connectMessage.set_sname("shipName"); 
connectMessage.set_xloc(0); 
connectMessage.set_yloc(0); 
connectMessage.set_zrot(0); 

出於某種原因,我設置我的字符串參數,先設置字符串值之前的字符串。所以,如果我做了set_pid,name字段也會變成pid。 set_scolor的名字& pid將被設置爲s_color。 set_sname的名字,pid & scolor會改成sname。看起來他們都共享相同的字符串指針字段位置。

執行後每個字符串字段的結果都是「shipName」。

我是不是正確初始化我的消息?或者我需要在這裏做些不同的事情?當我從編碼流中對消息進行序列化時,我收到了我期望的消息,但手動創建似乎無法與我目前正在嘗試執行的操作一起工作。

非常感謝您的信息。

+0

實際上'stats'是什麼?你錯過了給我們足夠的信息來診斷你的問題。請發佈[MCVE]。 –

+0

統計數據是一種數據結構,不幸的是這不是問題。我可以這樣做: server :: player :: Connected connectMessage; connectMessage.set_name(「clientName」); connectMessage.set_pid(「clientId」); connectMessage.set_scolor(「shipColor」); connectMessage.set_sname(「shipName」); connectMessage.set_xloc(0); connectMessage.set_yloc(0); connectMessage.set_zrot(0); 並且連接消息中每個字符串的結果字符串在執行結束時將是「shipName」。 – m11hut

+0

[添加附加信息](http://stackoverflow.com/posts/39928885/edit)給你的問題! –

回答

0

更改爲對我的字符串使用重複字段似乎已解決問題。

message Connected { 
    sint32 xloc = 1; // x spawn world position 
    sint32 yloc = 2; // y spawn world position 
    sint32 zrot = 3; // z spawn rotation 
    // [0] => username 
    // [1] => userid 
    // [2] => shipcolor 
    // [3] => shipname 
    repeated string userinfo = 4; 
} 

有了這個,我可以手動將新字符串添加到重複的字符串列表中。

server::player::Connected connectMessage; 
connectMessage.set_xloc(stats.m_xPos); 
connectMessage.set_yloc(stats.m_yPos); 
connectMessage.set_zrot(stats.m_zRot); 
// [0] => username 
connectMessage.add_userinfo(); 
connectMessage.set_userinfo(0, stats.m_clientName); 
// [1] => userid 
connectMessage.add_userinfo(); 
connectMessage.set_userinfo(1, stats.m_clientId); 
// [2] => shipcolor 
connectMessage.add_userinfo(); 
connectMessage.set_userinfo(2, stats.m_shipColor); 
// [3] => shipname 
connectMessage.add_userinfo(); 
connectMessage.set_userinfo(3, stats.m_shipName); 

它絕對允許一個更乾淨的.proto文件,但奇怪的是,使用單個字符串導致了一個問題。