VC++ unicode 와 stl::map 링크 부탁드립니다.
글쓴이: 송효진 / 작성시간: 화, 2005/06/14 - 11:18오후
Visual C++ 을 배우려고 합니다.
일단 목표는 ucs2 코드 로 된 데이터에서,
특정 문자를 치환하는 함수 dll 을 만드는 것입니다.
그래서 치환 테이블을 map 으로 설정하려고 했는데,
컴파일조차 안되네요.
map<wchar_t, wchar_t> tableHankata;
이 문장부터 잘못되었다고 나옵니다.
참조할만한 컴파일 가능한 소스 있는곳 링크좀 부탁드립니다.
아래는 삽질해봤던 코드입니다.
map 에서 막혀서 정작 함수부분이 맞는지는 모릅니다.
#include "STDAFX.H" #include <MAP> #include <STRING> map<wchar_t, wchar_t> tableHankata; extern "C" __declspec(dllimport) wchar_t * hankata(wchar_t *t); BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { tableHankata[0x00ac] = 0xac30; tableHankata[0x98b0] = 0xca30; tableHankata[0xe4b2] = 0x6030; return TRUE; } __declspec(dllimport) wchar_t * hankata(wchar_t *t) { int size = 0, index = 0; wchar_t c; while(t[index]) { if(c = tableHankata[t[index]]) { t[index] = c; } index ++; } return TRUE; }
Forums:
[code:1]#include "stdafx.h"
이렇게 하니 컴파일은 되는군요.
VC++ 6에서 SP를 안 깔았더니. 워닝에 비명을 질러 댑니다..
제가 주로 참고하는 STL 관련 사이트 입니다.
http://www.sgi.com/tech/stl/
http://oopsla.snu.ac.kr/~sjjung/stl/
Exeption 은 아랫분께 패스~
높이 날다 떨어지면.
아푸다 ㅡ,.ㅡ
1. 표준 헤더의 이름은 MAP이 아니라 map입니다. (STRING도
1. 표준 헤더의 이름은 MAP이 아니라 map입니다. (STRING도 마찬가지)
2. 표준 라이브러리의 모든 이름은 std namespace에 있습니다.
3. hankata()의 반환형은 wchar_t*인데 TRUE를 반환했군요. 지금은 반환형을
void로 하는 것이 적당해 보입니다.
4. wchar_t의 스트링을 받아서 변환 테이블에 따라 변환할 의도라면 hankata()의
while 루프 내용이 좀 이상하군요.
c = tableHankata[t[index]]
이것은 t
가 map에 있으면 변환될 값을 반환하고, 없으면 (t
, 0)의
pair를 map에 추가한 후 0(변환될 값)을 반환합니다. 아마 변환 과정 자체는 의도한
대로 되겠지만, 검색 과정에서 변환 테이블의 내용이 변경되는 부작용은 의도하지
않으셨을 것으로 생각합니다. 저라면 이렇게 하겠습니다.
처음에는 복잡해 보일 수도 있지만 STL 컨테이너를 사용하는 관용구(idiom)과 같은
것이니 이 기회에 익혀 두시면 두고두고 써먹을 수 있을 것입니다. 사실 이 작업은
표준 알고리즘인 transform()를 쓰면 아주 간결하게 표현할 수도 있습니다.
5. wchar_t의 배열보다 wstring을 쓰는 것도 좋겠습니다.
댓글 달기