マップデータをクライアントに送信しようとしていますが、これはマップのタイルの座標を含む複数のベクトルの形式です。全体マップ構造はこのようなものにすることができる(ない実際のコードが、私はあまりにもこれを使用して問題を再現):SFMLネットワーク| sf :: Packetsを介して他のオブジェクトを含むオブジェクトを送信するとヌルデータが発生する
struct Tile {
sf::Vector3<int> coords;
};
struct Map {
Tile tiles[4];
};
その後、私はsf::Packet
にオブジェクトのこのタイプを追加するには、これらの演算子を使用します。
sf::Packet& operator<<(sf::Packet& packet, sf::Vector3<int> vec) {
return packet << vec.x << vec.y << vec.z;
}
sf::Packet& operator>>(sf::Packet& packet, sf::Vector3<int> vec) {
return packet >> vec.x >> vec.y >> vec.z;
}
sf::Packet& operator<<(sf::Packet& packet, Tile test) {
return packet << test.coords;
}
sf::Packet& operator>>(sf::Packet& packet, Tile test) {
return packet >> test.coords;
}
sf::Packet& operator<<(sf::Packet& packet, Map test) {
for(int i = 0; i < 4; i++) {
packet << test.tiles[i];
}
return packet;
}
sf::Packet& operator>>(sf::Packet& packet, Map test) {
for(int i = 0; i < 4; i++) {
packet >> test.tiles[i];
}
return packet;
}
はここまで、どんな問題があってはならない:マップはsf::Vector3<int>
自体に直列化復元されなければならない4枚のタイル、直列化復元されなければなりません。
が次に送信来る:
Tile test;
test.coords.x = 42;
test.coords.y = 34;
test.coords.z = 43;
Map test3;
test3.tiles[0] = test;
sf::Packet packet;
packet << test3;
sock.send(packet);
このコードは非常によく動作します(私はGDBとpacket
の内容をチェックし、データが実際に同じです)。受信コードは、サーバー側あまりうまく動作します(まだGDBとの)パケットの内容を確認する
sf::Packet packet;
sock.receive(packet);
Map test;
cout << "packet received" << endl;
は、それが送信されたときと同じものを提供します。 test
の内容はランダムです(まだ初期化されていないので正常です)。
test
変数に実際のパケットデータをデシリアライズするとき本当の問題が起こります。
if(packet >> test) {
cout << test.tiles[0].coords.x;
} else {
cout << "fail" << endl;
}
印刷結果が0デシリアライゼーションは、(無コンソールに登場する「不合格」)よくやったが、データがあります間違っている。 test
の内容をGDBで調べると、その配列がすべて0であることがわかります。ここにGDBの出力があります:
(gdb) print test
$1 = {tiles = {{coords = {x = 0, y = 0, z = 0}}, {coords = {x = 0, y = 0, z = 0}}, {coords = {x = 0, y = 0, z = 0}}, {coords = {
x = 0, y = 0, z = 0}}}}
何が原因でしょうか?私はここで何か間違っていると確信していますが、なぜ私は本当に理由を知ることができません。任意の助けを事前に
感謝:)