기본 콘텐츠로 건너뛰기

5월, 2007의 게시물 표시

다국어 버전 만들기

현재 진행중인 프로젝트가 어느 정도 끝이 보이는 시점에서 다국어 버전을 만들어 보기로 했습니다.(국내 회사에서 사용하는 것이므로 필요하지는 않겠지만...) 먼저 주 프로젝트에서 resource.h , rc 파일 , 그리고 관련된 리소스 파일들을 이용해서 DLL을 만듭니다. InitInstance 함수에서 리소스 DLL을 로딩합니다. 로딩한 DLL로 리소스 핸들을 설정합니다. ExistInstance 함수에서 리소스 DLL을 해제시킵니다. 전체적인 줄거리는 위와 같으며 쉽게 할 수 있습니다. 그러나 현실에서는 그렇게 쉽게 되지 않습니다. 2번 항목에서 InitLanguage()함수를 InitInstance()에서 가장 먼저 호출하였습니다. - InitLanguage() 함수는 리소스 DLL을 로딩하고 리소스 핸들을 설정하는 함수 BOOL CAdminApp::InitLanguage() { //Set the new language m_hMultiLangRes = LoadLibrary("Lang\\AdminKorLang.dll"); if (m_hMultiLangRes) AfxSetResourceHandle(m_hMultiLangRes); return TRUE; } BOOL CAdminMain::InitInstance() { InitLanguage(); AfxEnableControlContainer(); FileZilla의 소스를 보고 이렇게 했습니다. 그랬더니 프로그램이 에러가 발생하고 종료되었습니다. 원인을 살펴보니 Grid Control을 폼의 초기화 부분(OnInitialUpdate)에서 Create 함수를 통해 생성하고 있었는데 생성하는데 실패되었습니다. 참고로 Grid Control은 유명한 MFC Grid Control이며 다른 DLL( 컨트롤에 관련된 DLL을 만들어 사용하고 있었음 )에 포함되어 있었습니다. 이

사용하지 않는 인자에 대한 warning 없애기

원본 : http://www.debuglab.com/knowledge/nowarning.html 1.요약 VS 에서 새로 만든 프로젝트의 디폴트 warning 레벨은 3 입니다. 하지만 많은 서적에서 warning 레벨을 4로 맞추어 놓기를 권장하고 있습니다. 컴파일러로부터 보다 많은 조언을 구할 수 있기 때문입니다. 이 경우에 사용하지 않은 인자에 대해서도 warning을 발생시키는데 MFC에는 이런 warning에 대비한 매크로가 있습니다. 2.본문 사용하지 않는 인자에 대해서 warning을 발생시켜주는 점은 참 고맙지만 고의로 그렇게 한 경우 - 보통 메시지 핸들러에서 이런 경우가 많습니다 - 에는 의미없는 메시지입니다. 이럴때는 크게 3가지 방법으로 warning을 제거할 수 있습니다. 1. 인자를 빼버린다. void CMyView::OnMouseMove( UINT, CPoint point) => 이해하기 힘든 코드가 될 수도 있습니다. 2. 인자를 주석처리한다. void CMyView::OnMouseMove( UINT /*nFlags*/, CPoint point) => 1 번보다는 좋지만, 문제점이 몇 가지 있습니다. 3. UNUSED 매크로를 사용한다. *추천* void CMyView::OnMouseMove( UINT nFlags, CPoint point) { UNUSED_ALWAYS(nFlags) ... } => 참 보기 좋네요.. ----------------------------------------------------------- UNUSED 매크로는 MFC에서 다음과 같이 정의되어 있습니다. #ifdef _DEBUG #define UNUSED(x) #else #define UNUSED(x) x #endif #define UNUSED_ALWAYS(x) x 정리하자면 UNUSED 는 release 버전에서만 사용하지

아이템 동기화

MDL 프로그램을 하다가는 성질을 버릴것 같습니다. 이런 형편없는 UI 툴을 제공하다니... 다이얼로그 에디터에서 텍스트와 칼라 픽커를 생성했습니다. 이 두 아이템들을 동기화 시키고 싶을때 - 텍스트에서 칼라 번호를 입력하면 칼라 픽커의 색상이 변경되고 칼라 픽커에서 색상을 선택하면 텍스트의 칼라 번호가 변경 - 아이템의 속성 창을 보면 Synonyms Id# 라는 항목이 있습니다. 0 이 아닌 같은 값으로 맞춰주면 Microstation에서 동기화를 시켜줍니다. 뭐 이거 하나는 좋습니다. 그리고 모든 아이템들의 ID를 유일해야만 합니다. 저는 처음에 ID를 직접 수정을 했는데( 뭐도 모르는 상황에서 ) 나중에 ID가 중복이 되니 이상한 상황이 발생했습니다.

관리자와 실무자의 잘못된 커뮤니케이션은 프로젝트 일정에 악영향을 미친다

두 수의 평균 구하기

예전에 두수를 더할때 오버플로우가 나지 않을까 걱정했던게 생각나네요. 그때는 그런 생각만 했었고 그냥 두 수를 더하여 나누어 평균을 구했죠. ㅎㅎㅎ 흔히 알고 있는 두 숫자의 평균을 구하는 방법은 다음과 같습니다. '두 숫자를 더해서 2로 나눈다' 이것을 C/C++ 코드로 보면 다음과 같습니다. int a = 10; int b = 20; int c = (a + b) 2; 이 방법은 a 와 b 의 값이 매우 크거나 매우 작은 경우 (매우 작은 경우는 매우 큰 경우에 -1 을 곱하면 된다) 에는 적용할 수 없습니다. 다음 코드를 실행해 봅시다. int a = 1000000000; int b = 2000000000; int c = (a + b) / 2; c 에 들어가는 값은 1500000000 이 아닌 -647483648 와 같은 엉뚱한 값이 된다. 분명히 a 의 값도, b 의 값도, 그리고 계산 결과인 c 의 값도 int 의 범위에 들어간다. 하지만 a + b 는 3000000000 (30억)이 되어 int 의 범위를 넘어서게 된다.(int 의 표현 범위는 대략 ±21억이다) 여기서 발생되는 오버플로우가 이처럼 엉뚱한 결과를 가져다 주는 것이다. 이와 같은 오류를 방지하기 위해서는 다음과 같이 평균을 구해야 한다. int a = 1000000000; int b = 2000000000; int c = (a > b ? (a - b) / 2 + b : (b - a) / 2 + a); ?: 연산자가 익숙하지 않은 분들을 위해 풀어쓰면 다음과 같다. int a = 1000000000; int b = 2000000000; int c; if (a > b) c = (a - b) / 2 + b; else c = (b - a) / 2 + a; 출처 : 온라인 게임 개발자 이창연

비교하는 정수 값으로 unsigned type을 쓰지 말자.

예전 프로젝트에서 큰 낭패를 보았는데, 흔히 우리가 for문을 아래와 같이 사용하게 되는데 for(int i = 0;i < max;++i) 예전 프로젝트의 일부분의 코드가 아래와 같이 되어있었습니다. for(size_t i = 0;i < max;++i) max의 값은 계산되어지는데 일반적으로 위의 코드는 아무런 문제가 없이 수행되었는데 max의 값이 음수가 될때에는 문제가 발생하게 됩니다. for(size_t i = 0;i < -1;++i) { printf("ddd"); } 위의 코드에서 print 함수가 호출되지 않을것 같지만 size_t가 가질수 있는 최대값만큼 호출됩니다. 컴파일러에서 size_t 타입과 비교를 위해 -1을 size_t타입으로 변환을 시켜버립니다. 그래서 우리가 원치 않는 결과가 발생하게 됩니다. 또한 아래의 코드도 위험합니다. 무한 루프를 돌게 됩니다. for(size_t i = 100;i >= 0;--i) { printf("ddd"); }