2014-08-27 32 views
0

我有以下方法:ProtocolBuffer對象ByteSize是錯誤

void ConnectionManager::SendAll() 
{ 
for (int t = 0; t < (int)m_Connections.size(); ++t) 
{ 
    if (m_Connections[t].socket != INVALID_SOCKET) 
    { 
     // Create the object 
     MessageID message; 
     message.set_type(MessageID::Type::MessageID_Type_PLAYERDATA); 

     for (int i = 0; i < (int)m_Connections.size(); ++i) 
     { 
      if (m_Connections[i].playerData.username() != google::protobuf::internal::kEmptyString) 
      { 
       auto temp = message.add_playerdata(); 
       temp = &m_Connections[i].playerData; 
      } 
     } 

     if (message.playerdata_size() > 0) 
     { 
      // Serialize to byte array 
      int size = message.ByteSize(); 
      void* buffer = malloc(size); 
      message.SerializeToArray(buffer, size); 

      Send(m_Connections[t].socket, buffer, size); 
     } 
    } 
} 
} 

現在的問題在於,在這種方法的結束,在該行:

int size = message.ByteSize(); 

我知道,數據加載正確(或至少應該),但大小是不正確的。它應該是30,它返回2.我不知道我做錯了什麼。

m_Connections中的數據可用,應該通過指針temp達到。我認爲,出於某種原因,數據從「消息」對象中丟失,但我不知道如何解決它。

回答

1
auto temp = message.add_playerdata(); 
temp = &m_Connections[i].playerData; 

這些線條看起來是錯誤的。 add_playerdata()返回一個指針。這意味着第二行只是將temp設置爲某個其他指針,而不對temp指向的消息執行任何操作。

MessageID::PlayerData* temp = message.add_playerdata(); 
temp = &m_Connections[i].playerData; 

也許你想這樣做,而不是:如果你寫出來的類型,而不使用auto這是比較明顯的

*temp = m_Connections[i].playerData; 

不過,我沒有看到這個bug如何導致ByteSize()爲2.它看起來像ByteSize()應該只有2,如果你沒有添加任何球員的消息,但然後playerdata_size()將是零,所以你根本無法進入序列化步驟。

+0

那麼事情就是temp是一個在MessageID對象「消息」中的PlayerData *類型的向量中的新項目。我在你複製的行中想要做的就是將我創建的向量中的數據分配給MessageID對象中使用的向量。我會嘗試你的想法。 – Dries 2014-08-28 18:35:41

+0

那麼,我還沒有檢查數據,但顯然是行:'* temp = m_Connections [i] .playerData;'解決了崩潰。你能解釋爲什麼嗎? – Dries 2014-08-28 18:42:31

+1

嗯,這是基本的C ...'temp'是一個指針,'* temp'是指針指向的東西。如果你寫'temp = &foo;',你只是改變指針,使它指向'foo',而不是指向之前的指針。因爲之後你甚至不再使用'temp',這沒有任何作用。另一方面,當你寫'* temp = foo;'時,你正在將'foo'的*值*複製到'temp'指向的東西上。 – 2014-08-28 22:18:43