我有以下方法:
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);
}
}
}
}
现在问题出在这个方法的最后,在第<:p>行
int size = message.ByteSize();
我知道数据已正确加载(或至少应该加载),但尺寸不对。它应该是30并且它返回2.我不知道我做错了什么。
m_Connections中的数据可用,应该由指针temp访问。我认为,出于某种原因,数据会从&#34;消息中消失。对象,但我不知道如何解决它。
答案 0 :(得分:1)
auto temp = message.add_playerdata(); temp = &m_Connections[i].playerData;
这些行看起来不对。 add_playerdata()
返回一个指针。这意味着第二行只是将temp
设置为其他指针,而不对temp
指向的消息执行任何操作。如果你写出类型而不是使用auto
:
MessageID::PlayerData* temp = message.add_playerdata(); temp = &m_Connections[i].playerData;
也许你想这样做:
*temp = m_Connections[i].playerData;
但是,我不知道这个错误会导致ByteSize()
成为2.如果你没有在消息中添加任何玩家,那么ByteSize()
看起来应该只有2个。然后playerdata_size()
将为零,因此您根本无法进入序列化步骤。