우와.. 이번에 멀티바이트랑 유니코드랑 수 없이 교환시키는 작업을 하면서 인코딩에 대한 이해가 많이 는 것 같다.. 유니코드는 2바이트로 이 세상의 모든 언어를 표시 할 수 있는 그런 놈이다. 이건 알고 아래 글을 읽도록 하자 후후. 일단 UTF-8이 널리 쓰이는 이유에 대해 설명을 간략이 들여보자. UTF-8은 멀티바이트이다. 65536개의 문자를 사용하는 캐릭터셋은 유니코드의 캐릭터셋을 사용하지만 유니코드는 무조건 1글자에 2byte씩이다. 그걸 1~4byte의 가변길이로 인코딩하는 방식이 UTF-8이다.(그래서 CP_UTF8을 멀티바이트 변환 상수에서 찾을 수 있음.) (캐릭터셋이라 하면 유니코드가 나타낼 수 있는 모든 문자를 말함) UTF-16이랑 32같은 놈들도 있지만 자주 쓰이는건 UTF-8이..
배열과 포인터가 동치라는 것은 이미 알고 있다. 예를 들어서 a[3]은 *(a+3) 이 되는 것이다. 하지만 다른 점은 배열은 포인터 상수로 선언 된다는 점이다. 즉 * const 이다. 따라서 int a[3]; int b[3]; 이 있을 때, a는 a[3]배열의 시작 주소를 나타내고 b 역시 b[3]배열의 시작 주소를 나타내지만 a = b; 는 할 수 없다. 왜냐면 const이기 때문에!! 해주고 싶다면 int a[3], int *b; 를 하고 b = a; 한다면 이것은 가능하겠다!! 자 이제... 2차원 배열의 포인터는 어떻게 선언할까? 그냥 대충 생각하면 꼭 int a[3][4]; int **p = a; 가 될 것 같이 생겼지만.. 되지 않는다. 왜일까? int a[3][4];로 선언한 이차원 배열..
int go( int search, int a, int b, int state, int turning ) { if( found == 1 ) return 1; if( turning > 3 ) //맨처음 시작을 생각해서 3임 { return 0; } if( map[a][b] == search && state != START ) { sx = a; sy = b; found = 1; return 1; } v[a][b] = 1; //U if( v[a-1][b] == 0 && ( map[a-1][b] == 0xFF || map[a-1][b] == search ) && a > 0 ) { if( state == U ) go( search, a-1, b, U, turning ); else go( search, a-1, b..
우선.. C++에서 CTest라는 클래스가 있을 경우 해당 객체에 대한 선언은 다음과 같이 할 수 있다. CTest test1, test2; 이 경우에 const를 붙여 쓰는 사람은 아마 거의 없을 것이다 -.-;; 그럴거면 왜 만들었어.. 만약 저 앞에 const CTest test1, test2; 이런식으로 const를 붙였다면 더이상 해당 객체는 변경을 할 수 없게 된다. 자 그럼 const가 사용되는 다양한 예를 쭉 적어보자 const CTest* pTest = new CTest; //이건 CTest const *pTest = new CTest; 와 같다 CTest* const pTest = new CTest; const CTest* const pTest = new CTest; int CTest:..
이중 포인터를 사용하는건 주로 포인터의 동적 배열을 나타내기 위해서 이다. 우선 아래와 같은 클래스가 하나 있다고 가정 해보자. class CTest { public: CTest() {} int a; }; 이녀석에 대한 포인터를 선언하고 객체 하나를 생성하려면 어떻게 해야할까? 다음과 같이 써주면 된다. CTest *pTest = new CTest; 이렇게 하면 pTest는 CTest의 객체를 참조한다. 근데 이제 CTest객체가 여러개 필요한 상황이 나오면 어떻게 해야할까 처음에 아무 생각없이 아래와 같이 했었다. CTest *pTest1 = new CTest; CTest *pTest2 = new CTest; ... 필요한게 정해져있다면 뭐 저래도 괜찮겠지만.. 그래도 매직넘버를 늘리는건 좋지 않다....
클래스를 주고 받을땐 레퍼런스를 사용하자!! 클래스 전체를 call by value로 넘긴다면 그 메모리는 어머어머하지만 레퍼런스로 넘기게 되면 겨우 포인터 변수의 크기 만큼만 넘기고 끝이다. 예를 들어서 AddPoint(POINT point); 라는 Method가 있다면 AddPoint(const POINT &point); 가 나을 것이다. (const는 적절히 써주자) 물론 호출한 놈의 인스턴스가 사라지지 않는 것이 확실히 될 때 얘기다.
vector의 iterator를 사용 중 for(std::vector::iterator it = vecData.begin() ; it != vecData.end(); it++) (*it)->GetName(); 이런게 있었다. 아무 생각 없이 쓰고보니.. it는 우선은.. 내가 선언한 std::vector::iterator 클래스의 인스턴스인데.. 여기에 왜 역참조인 *가 붙었지? == *it인데.. 아하 그럼 it는 의 포인터겠구나~ 하고 생각했지만.. 포인터가 아니였다..(kering 왈) 마치 포인터 처럼 오버로딩 돼 있었다. 우선 *가 오버로딩 돼있다. const_reference operator*() const 그외에 _Vb_const_iterator& operator++() 등등 vector 헤..
보통 MFC에서 이제 view에 사용할 소스 파일의 h와 cpp가 있을 때 이제 해당 뷰에서 사용할 컨트롤 및 클래스들을 사용할 때에 include를 cpp 파일에다가 한다. 헤더 파일에 인클루드 했다가는 무진장 꼬여서 애먹는다 -.-;; 차라리 사용할 클래스들을 그때 그때 cpp에 include하는게 편하다. 그렇다면 멤버 변수로 외부 클래스를 선언 할려면 어떻게 해야하는가 class의 헤더에 외부 클래스의 h가 include 되어 있지 않기 때문에 그냥 선언해선 되지 않을 것이다 예를 들어 내가 class CMain에서 사용하고 싶은 클래스가 CExample 이라고 해보자. //Main.h class CMain{ public: CExample m_example; }; //Main.cpp #includ..
- Total
- Today
- Yesterday
- linux
- algorithm
- C++
- Visual C++
- Troubleshooting
- C
- API
- source
- MFC
- gcc
- driver
- android
- NDK
- jni강좌
- jni
- Cloud
- db
- Python
- kering
- 리눅스
- java
- winapi
- 드라이버
- it
- database
- Quiz
- 음악
- 프로그래밍
- 안드로이드
- AWS
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |