C, C++ 문법 28

cast 연산자 사용하여 signed , unsigned 상호 형변환시 매우 주의가 필요

부호 없는 수, 부호 없는 수를 형 변환하거나 형 확장시에 매우 주의해야 된다. 문자열 관련 처리를 하는 과정에서 각각의 1바이트 char형 문자들을 계산하기 편하게 4바이트로 확장시켜서 연산을 하는데 의도하지 않았던 결과가 나와서 디버그해보니 그동안 형 변환에 대해 좀 착각해왔음을 알 수 있었다. char a = 0xB1; // ( 128보다 크므로 실제로는 음수값이다.) unsinged int b = (unsigned int)a; 혹은 unsinged int b = a; 여기서 b에는 0xB1이 아니라 0xFFFFFFB1 값이 들어간다. 일단 int형으로 변환을 먼저 시킨 후 unsigned로 변환하는 듯 하다. 위에서 b에 0xB1 값을 대입하고자 하는 목적인 경우에는 unsigned int b =..

C, C++ 문법 2011.07.21

비트 연산의 이해와 활용

비트연산자에는 다음과 같은 것들이 있다. ~ & | ^ > ~, &, | 연산자의 경우는 사용도가 높고 직관적으로 이해가 잘 된다. 훌륭한 사용예로 윈도우 스타일 변경을 들 수 있다. GetWindowLong, SetWindowLong으로 얻거나 변경이 가능하다. 위 API에서 스타일 결과값이나 인수는 DWORD 형 4바이트로 특정 비트에 각각의 속성을 매칭시키는 식이다. 윈도우 스타일뿐 아니라 소위 각종 속성이나 플래그는 이런 식으로 처리한다. 가령 WS_VISIBLE 속성은 총 32비트 중에 어느 곳을 지정해서 그곳의 비트가 1이면 해당속성을 가진 것으로 인식하는 것이다. 스타일이 4바이트(32비트)면 총 32개 속성을 주는 게 가능하다. 여담으로 이게 부족했던지 CreateWindowEx에서는 첫번..

C, C++ 문법 2011.07.10

typedef 태그네임 사용하여 구조체 선언시 문법에 맞는 올바른 형태와 주의점

C,C++ 공통으로 태그를 사용해 모두 통하게 하려면 다음과 같이 선언해야 한다. typedef struct _tagNode { TCHAR szDir[2048]; struct _tagNode *pNext; } Node; Node test; 맨 윗줄 _tagNode라는 이름을 생략해도 별 무리없지만 정확한 c문법은 아니라고 한다. 앞의 예처럼 구조체 안에서 선언한 구조체의 포인터를 선언하는 경우는 반드시 구조체 안에서는 c문법을 지켜서 struct 태그네임을 붙여야 되는 듯 하다. struct를 생략하면 컴파일 에러났다.(C파일로 테스트해 보았다.)

C, C++ 문법 2009.11.18

가변인수 다루기

가변인수, va_start, va_list, va_end 1 가.가변 인수 함수 여기서는 가변 인수 함수에 대해서 알아 본다. 가변 인수의 함수를 만드는 방법에 대해서는 물론이고 가변 인수 함수가 동작하는 원리에 대해서도 자세하게 분석해 볼 것이다. 조금 어렵기는 하지만 포인터를 적절하게 활용하는 예를 볼 수 있으며 포인터로 어떤 일이 가능한지를 경험할 수 있는 좋은 기회가 될 것이다. 가변 인수 함수가 어떻게 동작하는지를 설명할 수 있다면 포인터를 정복했다고 생각해도 좋다. 가변 인수란 말 뜻 그대로 인수의 개수와 타입이 미리 정해져 있지 않다는 뜻이며 그런 인수를 사용하는 함수를 가변 인수 함수라고 한다. 가변 인수 함수의 가장 좋은 예는 C언어의 가장 기초 함수인 printf이다. C언어를 배우는 ..

C, C++ 문법 2009.10.22

WideCharToMultiByte, MultiByteToWideChar 메모리 할당 관련 리턴 값

WideCharToMultiByte, MultiByteToWideChar와 관련해서 오해가 많고 헷갈리는 부분이 여섯번째 인수를 0으로 줬을 때의 리턴값이다. 리턴하는 값이 바로 인수로 집어넣을 수 있는 메모리 할당에 필요한 크기인지, 변환될 버퍼의 문자열 길이인지, 게다가 널터미네이트가 고려되었는지도 헷갈린다. 검색해서 여러 블로그와 웹페이지를 둘러보았는 데 문자열 변환결과는 맞게 나오지만 그 과정에서 잘못 의미를 이해하고 사용하는 경우도 많았다. ///////////////////////////////////////////////////////////////////2019년 추가)// WideCharToMultiByte, MultiByteToWideChar 함수는 작동이 독특하다. 특히 리턴값에 주목..

C, C++ 문법 2009.09.04

이중 포인터 사용의 의미와 실제 사용례

일차원적인 포인터 변수는 특정 자료형 값이나 특정되지 않은(void) 값을 지닌 메모리상의 주소 변수이고요. 더블 포인터는 역시 메모리상의 주소 변수이지만 그 값이 포인터(메모리상의 주소)인 변수입니다. 가령 int *a는 a의 값이 인트형 값을 가진 주소 변수이고 int **b는 더블포인터로서 인트형 포인터 값을 가진 주소 변수입니다. 즉 어떤 함수를 만들시 반환되는 값으로 메모리상 주소가 필요할때 사용합니다. 실제로 사용하는 이유는 예를 들자면 HBITMAP CreateDIBSection( HDC hdc, CONST BITMAPINFO *pbmi, UINT iUsage, // color data type indicator: RGB values or palette indices void **ppvBit..

C, C++ 문법 2008.12.25

해시 ppt - 자료구조

자료을 입력할때 해시테이블의 인덱스를 얻는 로직이 자료를 검색할 경우에도 그대로 사용되므로 빠른 검색이 가능하다. 즉 입력할 시 로직(해싱함수)을 사용함으로써 약간의 희생을 감수하고 검색시 보상받는 것이다. 보통 자료 입력은 개별적으로 이루어지고 검색 같은 경우는 대량의 데이터에서 찾는 형태를 취하는 경우가 많으므로 이런 자료구조는 아주 효용성이 높다고 생각된다.

C, C++ 문법 2008.09.12

해싱 필요한 이유 - 기본 개념

해싱이라는 것은 기본적으로 흩어뜨려 놓는다는 뜻입니다. 자료를 흩어놓음으로써 메모리는 더 많이 차지하지만 더 빨리 찾을 수 있지요. 예를 들어 100개의 자료가 있고 그 중에서 어떤 한 개의 자료를 찾는다고 할 때 최대 100번까지 찾아봐야 합니다. 하지만 해싱을 이용한다면 최대 10이나 5번만에도 자료를 찾을 수 있습니다. 메모리를 많이 사용하면 많이 사용할 수록 빨리 찾을 수 있지요. 예를 들어 번호로 이름을 찾는 경우를 생각해 보지요. struct data { int number; char name[128]; char *next; } 와 같은 구조체가 있다고 했을 때 해싱을 사용하지 않으면 다음과 같이 구현되지요. struct data *head; int add_nohash(int number,ch..

C, C++ 문법 2008.09.12

An Introduction to Hashing

An Introduction to Hashing Namgoong Jae-chang Dept. of Computer Science and Engneering, POSTECH 이 문서는 데이터베이스(database) 분야에서 널리 쓰이는 데이터 관리 기법 중에 하나인 해슁(hashing)에 대하여 설명하고 있다. 따라서 이 문서에서 설명하고 있는 해슁은 자료구조(data structure) 분야에서 다루는 것과는 다소 다른 관점에서 설명하고 있다는 점을 우선 인식하기 바란다. 해슁에 관한 분류가 책마다 다른 관계로 이 문서에서는 필자 나름대로의 분류법에 따랐음도 미리 밝히는 바이다. 1 해슁(Hashing)이란 무엇인가? 2 해슁(Hashing)의 필요성 3 해슁 알고리즘 (Hashing Algorithm)..

C, C++ 문법 2008.09.12

int *&a; 의 의미

int *&a; 의 의미 참 생소한 표현이다. 우선 다음을 보자. int b = 10; int &a = b; b라는 변수 공간에 10을 넣고 a는 b의 레퍼런스로 작동한다. 실제로 컴파일된 어셈블리 코드를 보면 포인터와 동일한 구조로 처리하고 있음을 볼 수 있다. 한마디로 언어에서 편의성 차원에서 허용한 개념임을 알 수 있다. 익히 알려진 c++ 복사생성자가 인수를 레퍼런스로 처리를 한다. ................................................................. int *&a; 의 의미를 보기위해 다음 예제를 보자. int a = 10; int *b = &a; int *&c = b; 이중포인터를 레퍼런스로 표현한 개념이다. *& 표시 순서를 주의하자. 레퍼런스..

C, C++ 문법 2008.09.03