분류 전체보기 89

LValue RValue

LValue RValuelvalue와 rvalue를 구분하는 가장 기초적인 방법은 등호(=)를 기준으로 좌변, 우변의 차이에 따라 구분하는 것이다. (Left, Right Value) 아래의 코드에서 x는 lvalue, 10은 rvalue이다. int x = 0; x = 10; 다음의 코드를 살펴보자. int x = 0; int y = 5; x = y;x=y라는 코드에서 x는 lvalue, y는 rvalue라고 불러야 할까? 사실 x, y 둘다 lvalue이다. 따라서 가장 기초적인 구분에서 더 나아가 구분하는 방법을 살펴보려한다.. lvalue rvalue를 구분하는 특징은 다음과 같다.lvalue의 특징1. lvalue는 좌변에 놓일수도 있고, 우변에 놓일수도 있다. 2. lvalue는 이름을 가진다..

프로그래밍/C++ 2018.02.13

Uniform Initialization

Uniform Initialization옛 C++의 초기화 문법은 다음과 같이 다양했다.C++ 11부터는 모두 중괄호 앞에 평등하다 (...)변수, 객체, 배열 등 모두 중괄호로 초기화가 가능하다.int i = 3; int arr[] = { 1,2,3,4,5 }; std::vector v; for(int i=0; iint로 암시적 형변환, 소수점 데이터 손실 char c1 = 256; // in->char 암시적 형변환, char의 범위를 벗어남. 데이터 손실로 인한 값 0 int a2 = {3.4}; // error char c2 = {256}; // error

프로그래밍/C++ 2018.02.06

Template Aliases

typedef이전부터 우리는 type을 다른 별명으로 호출하기 위해서 typedef를 많이 사용 해왔다. 예를들면 다음과 같은 코드들이 있다. typedef int INT; typedef unsigned long DWORD; typedef int BOOL; typedef unsigned char BYTE; typedef unsigned short WORD;usingusing이라는 키워드는 선언 사용, using 지시문, 그리고 별칭 및 typedef에 사용 할 수 있다. 특히 C++ 11에서의 using은 기존 typedef처럼 Alias를 부여할 수 있다. #include using namespace std; using INT = int; int main() { INT a; a = 0; return 0..

프로그래밍/C++ 2018.01.30

Function Pointer 사용하기

Function Pointer 사용하기. C++에서 포인터는 주소를 가르킨다. 흔히 우리가 보는 형태는 다음과 같았을 것이다. int * p = new int; *p = 10; 이는 변수의 주소를 가르키는 포인터다. 함수의 주소를 가르키는 포인터를 함수 포인터 즉, Function Pointer라고 한다. 함수 포인터는 일반 변수를 포인터와 약간 다르게 선언하는데 아래와 같이 선언한다. 반환형 (* 포인터변수이름) (함수의 매개 변수들); 다음과 같이 선언한다. #include using namespace std; int MyFunc() { return 1; } int main() { int(*p)(void); p = MyFunc; cout > cmd; if (cmd > bUseFunc3; if(bUse..

프로그래밍/C++ 2018.01.29

C++ Template이란

template 예로부터 많은사람들에게 C++의 Template 릿이라고 하면 뭔가 복잡하고 읽기 힘들다는 이미지가 있다.필자 또한 메타 템플릿 프로그래밍이 유행하던 시절 템플릿을 마개조해서 사용하느라 읽기 힘들고 유지보수하기도 어렵다느 소리를 들어왔기에템플릿에 대한 부정적인 이미지를 가지고 있었지만, 템플릿이란 존재를 언제까지 외면할 수 없을 뿐더러 꼭 사용해야하는 기능들도 있기에 템플릿에 대해 알아보기로 하였다. 오버로딩 코드를 짜면서 제곱 수를 반환하는 Square라는 함수를 만들었다. int Square(int n){ return n*n;} int main(){ Square(1); return 0;} 그런데, Square의 argument가 double형이길 바란다면? 어떻게 해야 할까?쉽게 생각..

프로그래밍/C++ 2018.01.14

시야 변환

시야 변환 View Matrix를 구하는 과정을 알아보자. View Transform(뷰 변환)은 월드를 카메라 좌표계로 만드는 변환이다. World 를 기준으로한 Local Space의 원점과 x, y, z 축을 나타내는 동차 좌표들이 다음과 같이 있다고하자. Qw = (qx,qy,qz,1) Uw = (ux,uy,uz,0) Vw = (vx,vy,vz, 0) Ww = (wx,wy,wz,0) 위의 정보를 근거로 View->World 좌표계 변환 행렬을 만들면 다음과 같다. | ux, uy, uz, 0 | W = | vx, vy, vz, 0 | | wx, wy, wz, 0 | | Qx, Qy, Qz, 1 | 그런데 우리가 원하는것은 World -> View 변환 행렬을 원하므로 이것의 역행렬을 구하면 된다...

1. Direct3D11 초기화

Direct3D 초기화 4X Multi Sampling을 지원하는 응용프로그램의 초기화 과정 예 1. D3D11CreateDevice 함수를 호출해서 Device와 DeviceContext를 생성 2. CheckMultiSamplingLevel을 호출해 지원하는 MSAA(MultiSampling Anti Aliasing)의 품질 수준 지원 정보 획득 3. SwapChain 관계를 정의하는 DXGI_SWAP_CHAIN_DESC 구조체를 채움 4. Device를 생성했던 IDXGIFactory Interface를 Query해서 SwapChain Instance를 생성 5. Back Buffer의 RenderTarget View를 생성 6. Depth,Stencil Buffer 생성 7. Render Targ..

0.DirectX 11 기본 지식

기본 지식 Direct3D의 개요 Direct3D는 응용 프로그램이 3차원 가속 기능을 이용하여 3차원 세계를 렌더링 할수 있게 하는 API 이다. Direct3D는 그래픽 하드웨어를 제어 할 수 있기 때문에, 화면을 깨끗히 지우라는 명령을 하드웨어에게 ID3D11DeviceContect::ClearRenderTargetView 함수를 통해서 전달 할 수 있다. 기존 널리 쓰이는 버전을 DirectX 9을 사용하였는데, 9의 경우 특화 기능을 사용하려면, 현재 하드웨어(그래픽 카드)가 해당 기능을 지원하는지 일일히 체크해야했다면, 11은 그럴 필요가 없다. 그래픽 장치가 DX11을 지원한다고 얘기하려면 DX11 의 모든 기능을 지원해야 한다는 엄격한 조건이 붙기 때문이다. COM Component Obj..

Windows 에러 핸들링, GetLastError

Windows 에러 핸들링 대부분의 Windows 함수가 사용하고 있는 반환 자료형은 아래의 표와 같다. 자료형 실패 했을 때의 값 VOID 이 함수는 절대 실패하지 않는다. 소수의 윈도우 함수만이 VOID 반환 자료형을 가짐 BOOL 함수가 실패하면 0을 반환, 성공시에는 0이 아닌 값을 반환한다. 즉, 비교시 TRUE와 비교하는 것보단, FALSE와 비교하는것이 나음 HANDLE 실패시 대개 NULL을 반환. 성공시 유효한 오브젝트 핸들을 반환한다. 몇몇 함수들은 -1로 정의된 INVALID HANDLE VALUE도 있기 때문에 주의 요망. SDK 문서에 명확하게 기술되어 있음 PVOID 함수가 실패하면 NULL을 반환, 성공시 PVOID가 데이터를 저장하고 있는 메모리 주소를 가르킴 LONG/DWO..

프로그래밍 2017.12.28