2011-03-19 2 views
0

포인터 추가가 실패한 이유를 알지 못합니다.포인터 추가

DWORD *pipebuf=new DWORD[10001]; 

Command *cr= (Command*)pipebuf; 
cr->command=2; 
DWORD* rooms=(pipebuf+1); //should work fine..sets the room pointer equal to pipe[2] 
*rooms=buff3; //where buff3=100 

그러나 pipebuf의 값에는 command 값만 포함되어 있으며 buff3의 값은 포함되어 있지 않습니다. 그러나 새 키워드를 제거하면 잘 작동합니다 ... 왜?

DWORD = unsigned_int

명령이 명령의 DWORD 변수와 클래스 ..이

Class Command { 
DWORD command; 
} 
+0

DWORD 및 명령이란 무엇입니까? – Mahesh

+0

DWORD = 서명되지 않은 _int. 명령은 명령의 DWORD 변수가있는 클래스입니다 – Jake

+0

어떤 언어입니까? C++? – Mat

답변

0

클래스 Command 같은 것은 (unsigned int) 사용자 정의 형식이며 DWORD 원시적 인 데이터 형식 . 이 경우, 왜이 일을 -

Command *cr = new Command[10001] ; 
DWORD *pipebuf=new DWORD[10001]; 

// After assigining values to DWORD pointed locations. Then you can do this - 

cr->command = pipebuf[0] ; // this sets the value of cr[0].command. 
2

추가 그것을 가리 원인, 포인터 앞으로 하나를 이동 -

Command *cr= (Command*)pipebuf; 
그래서
class Command { 
    public :  // Added public keyword 
    DWORD command; // DWORD is a typedef for unsigned int as you mentioned. 
}; // class definition should end with a semi-colon 

,이 할 수있는 방법입니다 귀하의 배열에 두 번째 DWORD. *(pipebuf+1)은 정확히 pipebuf[1]과 같습니다. 코드가 실행 된 후 *(pipebuf+1) 일명 *rooms 일명 pipebuf[1]는 종종 나쁜 스타일로 간주됩니다 그러나 100

참고 C++에서 포인터 타입 사이의 타입 캐스팅과 동일 많은 상황에서있을 수있는 반면, *pipebuf 일명 일명 pipebuf[0]cr->command, 2와 동일 바람직하지 않은 결과. Command의 배열을 할당하는 경우 new Command[...]; DWORD를 원하면 Command*으로 변환하지 마십시오.

간혹 유형간에 포인터를 사용해야 할 수도 있지만 일반적으로 정확히을 알고 있고 그렇게하지 않는 이유는 알고 있어야합니다.

(이 경우) 또는 dynamic_cast (상속으로 유형이 관련되어있는 경우이 사용은 일반적으로 훨씬 안전합니다)을 사용해야합니다.

+0

예 .. 정확히 .. * 방은 pipebuf [1]와 동일해야하고 pipe [1]은 100으로 설정해야합니다 .... 그러나 그렇게하지 못합니다 ... 예 그 나쁜 스타일을 알고 있지만이 상황에서는 코드를 더 쉽게 파악할 수 있습니다. – Jake

+0

가장 당황한 점은 동적 포인터에서 그것을 변경하여 수정된다는 것입니다. 새 키워드를 제거하고 있습니다. – Jake

+0

캐스팅 포인터 +1이 잘못되었습니다. – rve

0

나는 이것을 주석으로 만들 것이다. 그러나 나는 그것들에서 코드 포맷팅을 할 수 없다.

는이 코드를 실행, 예상대로 출력은 "2 100"입니다 : 당신이 완전한 프로그램으로 질문을 확장 할 수있는 가장 간단한 방법

#include <iostream> 

using namespace std; 

typedef unsigned int DWORD; 
class Command { 
    public: 
    DWORD command; 
}; 

int main() 
{ 
    DWORD buff3 = 100; 
    DWORD *pipebuf = new DWORD[10001]; 
    Command *cr = (Command*)pipebuf; 
    cr->command = 2; 
    DWORD *rooms = (pipebuf+1); 
    *rooms = buff3; 

    std::cout << pipebuf[0] << " " << pipebuf[1] << endl; 
} 

AFAICT.

문제가 표시 될 때까지 원본 코드의 내용을 추가하고 추가해 볼 수 있습니까?