본문 바로가기

C언어120

항목6. 증가 및 감소 연산자의 전위 / 후위 형태를 반드시 구분하자. 흔히 쓰는, ++, -- 연산자에 대해서 설명하고 있는 항목이다. i++이나, ++i냐, i--이냐, --i냐... 이것의 원리를 좀 알아 보고자 하는거 같다. 역시나 가장 기본은, 사용 후 더하느냐, 더한 후 사용 하느냐. 라고 보면 되겠지만 조금 자세히 파보자. 먼저 i++, ++i의 차이인데, 증가, 감소 연산자는 전위형태이든, 후위형태이든, 인자를 받지 않는(사용하지 않는) 구조이다. 그렇기 때문에 오버로딩을 하기 위해서 걸리는 매개변수의 타입이나, 갯수등으로 구별 하기가 까다로워 진 것이다. 이를 위해 약속한 것이, 전위는 그냥두고, 후위 형태는 int 타입의 인자를 받는 것으로 하자. 라고 약속하였다고 한다. 다음과 같이 말이다. #include using namespace std; class.. 2011. 4. 29.
항목5. 사용자 정의 타입변환 함수에 대한 주의를 놓지 말자 이번 항목은 타입변환에 대한 내용. 코드를 통해 문제점 부터 파악해 보자. #include using namespace std; class AAA { int m_iNum1; public: AAA( int num1 = 0, int num2 = 1 )// 단일 인자 생성자 { m_iNum1 = num1 / num2; } operator double() const; }; AAA::operator double() const { return static_cast(m_iNum1); } void main() { AAA a( 3, 2 ); double d = 0.5 * a; // 아마 본래 의도는 이런 것이겠거니.... cout 2011. 4. 28.
항목4. 쓸데 없는 기본 생성자는 그냥 두지 말자. 차암.. 이 부분은 읽으면 읽을 수록, "아. 어쩌라고 ㅋㅋ" 라는 말이 절로 나온다. 쉽게 풀어 설명하면, class AAA { public: int id; AAA( int _id ) { id = _id; } };​ 다음과 같은 클래스가 있다고 치자. 사용자는 무언가 생성할때 ID를 같이 초기화 하고 싶은것이다. 각 id는 중복 되서는 안되고, 고유의 id를 가지고 있다고 치자. 그렇기 때문에 생성할 때 id를 넣어 주는 식의 방법을 채택 하였는데, 문제는 이거다. void main() { // 잘 된다. AAA a(10); // 이런식으로 하면 잘 된다. AAA arra[] = { AAA(0), AAA(1), AAA(2), AAA(3), }; // 여기서 부터가 문제 AAA aaa; // 기본 생성자.. 2011. 4. 25.
API-GetAsyncKeyState( 키보드 입력함수 ) DX에서 키보드 입력을 받게 될때, API함수를 사용해 보았는데, 자꾸 까먹게 되어 따로 포스팅을 한다. 키보드 입력을 처리 하는 함수로는 GetAsyncKeyState 함수와 GetKeyState가 존재 하는데 GetAsyncKeyState에 대해서 간단하게 필요한 부분만 빠르게 포스팅하도록 하자. 주로 GetAsyncKeyState를 사용할 때 함수만 딸랑 쓰는게 아니라 추가적인 연산을 해주게 되는데, if( GetAsyncKeyState( VK_DOWN ) & 0x0001 )// 이렇게 쓰거나 if( GetAsyncKeyState( VK_DOWN ) & 0x8000 )// 이렇게 쓴다.​ GetAsyncKeyState는 키가 눌렸을 때 GetAsyncKeyState의 0x8000 bit가 1이된다... 2010. 6. 28.
DirectX - 행렬(Matrices) Dx에서 3차원의 정점(Vertex)를 화면상의 모니터로 출력해 주기 위해서는 3가지의 행렬 변환이 필요 하다. 1. 월드 행렬 2. 뷰 행렬 3. 투영 행렬 월드 행렬의 경우에는 3D오브젝트의 로컬좌표를 3차원의 필드에 특정 위치에 뿌려 주기 위해서, ( 좀더 간단하게 말하면, 로컬 좌표를 월드 좌표로 변환 하는 작업 ) 뷰 행렬은 카메라를 셋팅한다고 생각하면 되는데, 뷰 행렬을 만들기 위해서는 추가적인 3개의 백터가 필요 하다. 카메라의 위치, 카메라가 바라보는 방향, 카메라의 Up벡터가 필요 하다. 마지막으로 투영 행렬은, 각각의 3D좌표들을 우리의 눈으로 보게 되는 2D로 변경하는 작업을 한다. 이런 작업을 렌더링 파이프라인이라고 하는데, 3D의 좌표를 모니터 화면에 뿌려주기 위한 작업이라고 보면.. 2010. 6. 14.
DirectX-정점(vertex_삼각형 띄우기) 먼저 정점을 띄우기 위해서는 정점을 보관할 정점 버퍼가 필요 합니다. 정점 버퍼에 FVF(사용자 정의 정점 형식)를 사용하여 생성할 수 있습니다. 최초 생성한 정점 버퍼는 쓰레기 값이 들어가 있기 때문에, Lock함수를 사용하여 값을 넣을 수 있는 포인터를 가져 옵니다. 그 후 미리 지정해 놓은 정점 정보를 정점 버퍼에 저장합니다. HRESULT InitVB() { // 삼각형을 렌더링 하기 위해 3개의 정점 선언 CUSTOMVERTEX verticse[] = { { 150.0f,50.0f,0.5f,1.0f, 0xffff0000, }, { 250.0f,250.0f,0.5f,1.0f, 0xff00ff00, }, { 50.0f,250.0f,0.5f,1.0f, 0xff00ffff, }, }; // 점정 버퍼를.. 2010. 5. 19.