본문 바로가기

반응형

C/C++

(66)
템플릿(template)을 이용한 에러객체 만들기 ♥ 에러 객체란? " 에러객체 = 에러코드 + 에러문자열 " 프로그래밍을 하다보면 종종 에러코드를 정의해서 써야하는 경우가 있다. 종종이라기보다는 항상 에러코드를 정의해야한다. C++을 사용하는 나의 경우에는 enum을 주로 이용하여 에러코드가 겹치는 것을 방지하고, 다른 언어를 사용하는 사람들도 각자의 언어에서 제공하는 여러가지 방법을 사용하여 에러 코드를 정의해 쓸 것이다. 이렇게 에러코드들을 주루룩 정의해서 쓰다보면 한가지 아쉬운 점이 꼭 생각난다. "에러 코드만 넣으면 무슨 에러인지 알수 있는 방법은 없을까?" 오늘 소개해볼 '에러 객체'라는 것은 위의 불편함을 조금이라도 해결해 보기 위해 만들어진 몸부림 중에 하나다. ♥ 에러 객체에게 필요한 것들? 중복은 절대 안되!! 에러 코드는 중복되어서는..
템플릿 특화를 이용한 멀티 키 맵(Multi Key Map) 이전에 템플릿 특화(template specialization)와 특화를 이용한 튜플(Tuple)클래스를 만들어 본적이 있다. 오늘은 비슷한 원리를 이용해 N개의 키를 가질 수 있는 멀티 키 맵을 만들어 보겠다. 멀티키 맵이라고 해서 특별이 다를 것은 없다. 다만 단일 키만을 제공하는 std::map을 좀 더 확장하여 N개의 키를 타입 리스트를 통해 넘겨주는 것 뿐이다. 물론 이런 방법 말고도 구조체를 키로 쓰는 std::map을 활용하거나, 바이너리 메모리로 모든 키들을 복사해서 쓰는등 구현에는 다향한 취향과 트레이드 오프가 존재한다. 오늘 이 포스트에서 소개하는 것은 그 방법들 중 한 가지 방법일 뿐이다. 멀티키 맵에 관련된 설명에 앞서 이전에 다뤘던 Typelist라던지 템플릿 특화의 개념은 이미 ..
윈도우(Win32) 프로그램에서 콘솔창 띄우기 1. 왜 윈도우(Win32) 프로그래밍에서 콘솔 창이 필요한가 윈도우 창에서 프로그램을 작성하다 보면 쉽게 쉽게 디버그 상태를 보여 줄수 있는 창이 있다면 좋을 텐데 라는 생각을 종종 하게 된다. 물론 새로운 자식윈도우를 하나 더 띄우고 거기에 리스트 컨트롤을 붙인다면 그런 문제가 해결 되긴 하겠지만 그리 크지도, 작도 않은 프로그램에서 새로운 디버그 창을 만들어 내는 것은 여간 귀찮은 일이 아니다. 여러 SendMessage등 여러 단계를 거쳐야 하고, 초보에게 익숙하지 않은 함수를 쓰는 것보다는 printf를 사용한다면 프로그램 작성의 편리와 가독성을 높일 수 있을 것이다. 2. 사용 방법 1) #include 콘솔 모드에서의 입출력을 하기위해서는 'stdio.h'가 필요하다. 2) 본 문 다음 두 ..
printf 에서 long long, unsigned long long 출력하기 매번 까먹는다. long long x = 9223372036854775807; printf("%I64d\n", x); unsigned long long ux = 18446744073709551615; printf("%I64u\n", ux); 한가지 주의 할 점은 소문자 l(엘)이 아니라 대문자 I(아이)라는 것이다.
Conditional Break point with string(char*) - 특정 문자열일 경우 브레이크 포인트 활성화 하기 이전 포스팅([도구의발견] - Break point)에서 Visual Studio 디버거의 브레이크 포인트를 사용하는 방법에 대해서 알아 보았다. 그 중 브레이크 포인트에 조건을 걸어 주는 방법(Conditional breakpoint)에 대해서도 알아 보았는데, 오늘은 conditional breakpoint의 한계와 우회방법(?)에 대해서 알아보겠다. [도구의발견] - Break point 의 내용 대로 하는 경우, 정수 값, 문자 값에 대해서는 조건문이 정상동작하지만, 문자열(char*, std::string) 같은 경우 전~혀 제대로 동작하지 않는다. 정확한 이유는 잘 모르겠지만, 그냥 나의 생각으로는 포인터 값을 주는 경우, 해당 포인터가 가리키고 있는 문자열을 비교하는 것이 아니라 포인터 자체..
템플릿 특화를 이용한 튜플 클래스 'Modern C++ Design'에서 소개되고 있는 튜플(Tuple)이라는 개념은 일종의 레코드로써 우리가 일반적으로 생각하는 구조체라고 생각하면 된다. 단 구조체는 만들 때 마다 멤버 변수의 이름이나 구조체의 이름을 지정해 줘야 하지만 '그것것에 대해 신경 쓸 필요가 없는.. 다시 말하면 '이름없는 구조체'를 튜플이라고 하고 있다. 어디에 쓰는지야 각자 프로그램을 만들면서 살다 보면 스스로 알게 될 것이고, 이번 포스트에서는 템플릿 특화(Template specialize) 를 이용한 튜플 클래스 구현에 대해서 알아 보겠다. Tuple 클래스의 기본적인 개념은 '상속'이다. 클래스 Derived가 클래스 Base를 public으로 상속 한다고 생각해 보자. 이런 경우 Derived는 Base의 모든 ..
C++ #line은 뭐지? Syntax: #line line_number "filename" #line 커맨드는 __LINE__ 과 __FILE__ 의 값을 변경하기 위해 사용된다(파일 명은 옵션이다. 적어 넣어도 되고 안 해도 된다.) 예를 들어 아래와 같이 : #line 10 "main.cpp" …라고 쓰게 되면 현재는 main.cpp 파일의 10번째 줄이 되는 것이다.
[C++] WideCharToMultiByte() 요즘 비주얼스튜디오 2008에서 코딩하고 있는데 이녀석은 디폴트 인코드 값이 UNICODE인지라 1바이트 짜리 char 데이터가 필요 하면 wide charactor에서 multibyte로 변경해주어야만 한다. 매번 쓸때마다 함수들의 파라메터를 찾기 위해 msdn을 찾아 보게 만드는 귀찮은 함수다. 그래서 나름 간단하게 만든다고 만들어 보았다(요걸 라이브러리로 만들면 안되냐고 따지지 마세요..안하는게 아니라 못할만한 이유가 있어서 못하는 것이니..ㅠㅠ) #include std::string wstringTostring(const std::wstring& strSrc) { char* szRet = NULL; int len = ::WideCharToMultiByte(CP_ACP, 0, strSrc.c_str..
fcntl() 함수를 이용한 File locking 구버젼의 UNIX 시스템에서는 레코드 단위(혹은 byte range 단위)에 대한 loking을 지원 하지 않았다. 하지만 여러가지 상업적인 이유와 역사적인 이유로 인해서 각 UNIX 계열 시스템에서도 레코드 단위의 locking을 지원하기 시작 했다고 한다. #include int fcntl(int filedes, int cmd, .../* struct flock *flockptr */); record locking을 위해서 사용되는 cmd의 인자로는 F_GETLK, F_SETLK 또는 F_SETLKW가 올수 있다. 세번째 인자인 flockptr은 flock 구조체의 포인터다. 인자의 설명은 이름을 통해 직관적으로 알 수 있으니 건너 뛰기로 하고 F_GETLK에 대해서만 간단히 알아 보자. F_GETL..
구조체 비트 단위 멤버 우리가 프로그램을 작성하다 보면 꼭 1byte, 2byte 같은 바이트 단위 크기의 자료를 저장 할 필요가 없을 경우가 있다. 예를 들자면 남/녀 성별을 구분하고자 할때 이것은 딱 1bit만이 필요 할 뿐이다. 하지만 가장 작은 자료형인 char 조차도 8bit를 차지한다. 여기서 그에 대한 대안을 제시한다. 다음과 같이 구조체를 생성하게 되면 각 멤버는 콜론 뒤에 적인 수 만큼의 비트단위로 자료를 저장 할 수 있게 된다. ※ 일반 변수에는 적용이 되지 않으니 일반 변수 잡고 삽질하는 짓은 하지 말자. struct STRUCTURE { int member1: 1; // 1 bit int member2: 2; // 2 bit int member3: 4; // 4 bit }; 위와 같이 멤버 변수 뒤에 콜론..

반응형