복사

2014-01-16 1 views
0

그래서 내가 그렇게복사

편집과 같은 설정 구조 한 :

struct PLAYERCOORDINATESSTRUCT 
{ 
    int type, x, y; 
    bool isalive; 
    bool isconnected; 
    PLAYERCOORDINATESSTRUCT(int customx, int customy, bool customisalive, bool customisconnected) 
    { 
     type=(PLAYERCOORDS); 
     x = customx; 
     y = customy; 
     isalive = customisalive; 
     isconnected = customisconnected; 
    } 
    PLAYERCOORDINATESSTRUCT() 
    { 
     type=(PLAYERCOORDS); 
    } 
}; 

char* bufferwithstructdata = new char[sizeof(PLAYERCOORDINATESSTRUCT)-4]; 
//-4 since it's missing first int 
PLAYERCOORDINATESSTRUCT testdata; 
memcpy(&testdata,bufferwithstructdata,sizeof(PLAYERCOORDINATESSTRUCT)-4) 

는 내가 문자를 PLAYERCOORDS = 1, 그것은 내 코드의 시작 부분에 정의되어 int 구조체 (구조체의 처음 4 바이트)를 제외하고 이러한 구조체 중 하나에 대한 정보를 모두 보유하고있는 버퍼

오프셋을 사용하여 원본을 올바르게 memcpy하는 방법을 알아 내려고합니다. int x에서 시작하려면 구조 주소에서 4 바이트 떨어져 있어야합니다. 그러나 주소를 4로 추가하려고 시도했을 때 (& testdata + 4) 대신 주소에 40을 추가했습니다. 누구든지 구조에 4 바이트 오프셋을 사용하여 memcpy를 사용하는 방법이나 한 번에 10 바이트 대신 4 바이트 씩 주소를 오프셋 할 수있는 방법에 대한 단서가 있습니까?

감사합니다. + 연산자는 포인터에 적용하기 때문에 그 이유는

memcpy(((char*)&testdata)+4, bufferwithstructdata, sizeof(PLAYERCOORDINATESSTRUCT)-4); 

는 정수 지정된 시간을 추가

물건의 크기가 지적되고 :

답변

3

은 당신이 원하는 것은 다음이다. 이것은 주소에 4를 더하는 이유입니다. 4를 추가하기 전에 char *로 변환하면 4 바이트 위치가 추가됩니다. 이것은의 크기에 관계없이 주소로 하나 개의 정수 크기 단위를 추가 할 수있는 이점이있다

memcpy(((int*)&testdata)+1, bufferwithstructdata, sizeof(PLAYERCOORDINATESSTRUCT)-4); 

: 당신이 뭔가 좀 더 이식을 원하는 경우 또한, 다음은 당신이 원하는 것을 할 수있는 좋은 트릭 것 int. Lalaland으로

지적했다, 그것과 같이 offsetof를하는 것이 더 좋다 :

memcpy(offsetof(PLAYERCOORDINATESSTRUCT, x), bufferwithstructdata, sizeof(PLAYERCOORDINATESSTRUCT)-4); 
+0

당신에게 너무 많은 CrazyCasta 감사합니다! 나는 너무 어려워 XD – user2980207

+0

[offsetof] (http://en.cppreference.com/w/cpp/types/offsetof)이 코드를 이식성있게 (그리고 읽기 쉽도록) 만들 수 있습니다. – Lalaland