gpt4 book ai didi

c++ - Protocol Buffer 对象字节大小错误

转载 作者:行者123 更新时间:2023-11-28 06:43:14 25 4
gpt4 key购买 nike

我有以下方法:

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 访问。我认为,由于某种原因,数据从“消息”对象中丢失了,但我不知道如何解决。

最佳答案

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() 将为零,因此您根本不会进入序列化步骤。

关于c++ - Protocol Buffer 对象字节大小错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25535501/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com