2016-10-08 1 views
-1

난과 같은 메시지가 : I과 같은 몇 가지 이유를 들어구글 Protobuf3 여러 문자열

server::player::Connected connectMessage; // send this to this joining client 
connectMessage.set_name("clientName"); 
connectMessage.set_pid("clientId"); 
connectMessage.set_scolor("shipColor"); 
connectMessage.set_sname("shipName"); 
connectMessage.set_xloc(0); 
connectMessage.set_yloc(0); 
connectMessage.set_zrot(0); 

: 내 C 같은 ++ 코드 내에서 초기화를 시도하고

message Connected { 
    sint32 xloc = 1; // x spawn world position 
    sint32 yloc = 2; // y spawn world position 
    sint32 zrot = 3; // z spawn rotation 
    string sector = 4; // sector name (unsure about this) 
    string name = 5; // player name 
    string pid = 6; // player id 
    string scolor = 7; // ship color 
    string sname = 8; // ship name 
} 

을 내 문자열 매개 변수, 그 문자열 값으로 설정되기 전에 이전 문자열을 설정합니다. 그래서, 만약 내가 set_pid 이름 필드는 또한 PID로 변경됩니다. set_scolor 이름 & pid가 s_color로 설정됩니다. set_sname 이름, pid & scolor가 sname으로 변경됩니다. 그들은 모두 같은 문자열 포인터 필드 위치를 공유하는 것 같습니다.

각 문자열 필드의 결과는 실행 후 "shipName"이됩니다.

메시지를 올바르게 초기화하지 못했습니다. 아니면 여기서 다르게해야합니까? 코딩 된 스트림에서 메시지를 일련 번호로 만들 때 예상되는 메시지가 표시되지만 수동 작성이 현재 수행하려고 시도하고있는 것과 작동하지 않는 것 같습니다.

감사합니다.

+0

실제로'stats' 란 무엇입니까? 문제를 진단 할 수있는 충분한 정보를 제공하지 않으 셨습니다. [MCVE]를 게시하십시오. –

+0

통계는 불행히도 문제가되지 않는 데이터 구조입니다. 할 수있는 일 : server :: player :: Connected connectMessage; connectMessage.set_name ("clientName"); connectMessage.set_pid ("clientId"); connectMessage.set_scolor ("shipColor"); connectMessage.set_sname ("shipName"); connectMessage.set_xloc (0); connectMessage.set_yloc (0); connectMessage.set_zrot (0); 이며 연결 메시지의 각 문자열 결과 문자열은 실행이 끝나면 "shipName"이됩니다. – m11hut

+0

[추가 정보 추가] (http://stackoverflow.com/posts/39928885/edit) 질문하시기 바랍니다! –

답변

0

문자열에 반복 필드를 사용하도록 변경하면 문제가 해결 된 것 같습니다.

message Connected { 
    sint32 xloc = 1; // x spawn world position 
    sint32 yloc = 2; // y spawn world position 
    sint32 zrot = 3; // z spawn rotation 
    // [0] => username 
    // [1] => userid 
    // [2] => shipcolor 
    // [3] => shipname 
    repeated string userinfo = 4; 
} 

이렇게 반복 문자열 목록에 새 문자열을 수동으로 추가 할 수 있습니다.

server::player::Connected connectMessage; 
connectMessage.set_xloc(stats.m_xPos); 
connectMessage.set_yloc(stats.m_yPos); 
connectMessage.set_zrot(stats.m_zRot); 
// [0] => username 
connectMessage.add_userinfo(); 
connectMessage.set_userinfo(0, stats.m_clientName); 
// [1] => userid 
connectMessage.add_userinfo(); 
connectMessage.set_userinfo(1, stats.m_clientId); 
// [2] => shipcolor 
connectMessage.add_userinfo(); 
connectMessage.set_userinfo(2, stats.m_shipColor); 
// [3] => shipname 
connectMessage.add_userinfo(); 
connectMessage.set_userinfo(3, stats.m_shipName); 

분명히 더 깨끗한 .proto 파일을 허용하지만 개별 문자열을 사용하는 것이 문제를 일으키는 것은 이상합니다.