2017-06-10 20 views
1

マップデータをクライアントに送信しようとしていますが、これはマップのタイルの座標を含む複数のベクトルの形式です。全体マップ構造はこのようなものにすることができる(ない実際のコードが、私はあまりにもこれを使用して問題を再現):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}}}} 

何が原因でしょうか?私はここで何か間違っていると確信していますが、なぜ私は本当に理由を知ることができません。任意の助けを事前に

感謝:)

答えて

1

[OK]を、私は最終的に、これは動作しませんでした理由を理解するために管理しました。 答えは、もちろん、非常にばかげていて、愚かなC++初心者の典型です.D。

オブジェクトを参照渡しせずに演算子関数を使用することは、(変数の内容が演算子関数内に残り、変更されないため)一度も働くことができませんでした。だから、

、この変更:これに

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; 
} 

がはるかに優れて働いた:)