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達到。我認爲,出於某種原因,數據從「消息」對象中丟失,但我不知道如何解決它。
那麼事情就是temp是一個在MessageID對象「消息」中的PlayerData *類型的向量中的新項目。我在你複製的行中想要做的就是將我創建的向量中的數據分配給MessageID對象中使用的向量。我會嘗試你的想法。 – Dries 2014-08-28 18:35:41
那麼,我還沒有檢查數據,但顯然是行:'* temp = m_Connections [i] .playerData;'解決了崩潰。你能解釋爲什麼嗎? – Dries 2014-08-28 18:42:31
嗯,這是基本的C ...'temp'是一個指針,'* temp'是指針指向的東西。如果你寫'temp = &foo;',你只是改變指針,使它指向'foo',而不是指向之前的指針。因爲之後你甚至不再使用'temp',這沒有任何作用。另一方面,當你寫'* temp = foo;'時,你正在將'foo'的*值*複製到'temp'指向的東西上。 – 2014-08-28 22:18:43