기본 콘텐츠로 건너뛰기

2007의 게시물 표시

메뉴 추가

위와 같이 PDMS에 메뉴를 추가하는 방법입니다. 아래는 DESIGN 모듈에 메뉴를 붙이는 방법입니다. 1. PDMS 설치 폴더\pmllib\design\forms\appdesmain.pmlfrm 파일을 엽니다. 2. appdesmain.pmlfrm파일에서 menu bar를 추가합니다. 3. 폼 추기화 부분에서 추가한 menu bar에 붙을 메뉴를 생성합니다.

LOGGING 을 얼마나 중요하게 생각하십니까?(LOG4CXX)

황제펭귄의 게임개발이야기 [여기는 한국] | 황제펭귄 http://blog.naver.com/kimbeast/60016524389 hello world 프로그램을 만들때 초보는 기능 구현에만 충실하게 된다. void main() { printf("hello world"); } 이렇게 만들어 놓구..아 ~~ 기쁘다.이렇게 생각하겠지. 중급 정도 되면 고민을 먼저한다. 이거 hello world 를 출력하지만 나중에는 입력받아서 처리하게 할꺼야. void main() { char chInput[80]; printf("출력할 글자를 입력하세요"); scanf("%s", chInput); printf("%s", chInput); } 조금더 생각하는 사람이라면.. 입력방식의 변화가 생기기때문에 로직분리를 위해서 함수또는 class로 입력기를 처리할수 있다. void main() { CInputManager inputManager; inputManager.input(); printf("%s", inputManager.getInputChar()); } 자..그럼 만족하겠지. 근데..예를 들어 문제가 생겼다고 하자. 출력이 안된다던지.한글이 깨진다던지.아니면..DB에서 읽어들이는데 자꾸 읽히지가 않고 문제가 생긴다고 하자. 어떻게 해결할 것인가?~ 간단한 프로그램이니까 디버그로 돌리면 될것이다. 그런데 큰 프로그램이라면 어떻게할것인가~? 개발할때 무수히 많은 printf문장으로 console에 출력을 쭈르륵 할것이다. 그리고 나중에 서비스에 올릴때에는 이넘의 printf 또는 cout

[STL] erase()를 사용하여 List 원소 삭제 시 주의사항

picbuddy님의 블로그 (Mesh Generation) | 플라나 http://blog.naver.com/picbuddy/80032246219 다시 한번 기억을 환기시키기 위해 /////////////////////////////////////////////////////// for( Iterator = Vector.begin(); Iterator != Vector.end(); ) { Vector.erase(Iterator); } /////////////////////////////////////////////////////// for( Iterator = List.begin(); Iterator != List.end(); ) { List.erase(Iterator); } 위 두 문장의 차이가 뭘까? 위의 문장에서는 문제가 없지만 아래 문장에서는 에러가 발생한다. 왜 그럴까? erase 함수의 구현은 둘다 똑같은데... 그 이유는.... RandomAccessIterator와 BidirectionalIterator의 차이에 있습니다. vector는 해당 원소가 삭제되면 Iterator의 공백을 삭제된 원소 다음에 있는 원소 위치로 채워지게 된다. 이는 RandomAccessIterator(멋대로 접근 가능 지시자)라 가능한 듯...(솔직히 컴파일러에 따라 다른지 그것까지는 모르겠음. 일단 Visual Studio에서는 그렇게 작동) 허나 list는 BidirectionalIterator(순서대로 차근차근 접근 가능)이므로 해당 원소가 삭제되면 Iterator는 그 다음 위치를 잃어버리게 되는 것이다. 결국 그 다음 지시자의 위치는 까마득한 별나라로... 이를 위한 해결 방법 가장 확실한 방법은 erase 함수의 리턴값을 이용하는 것이다. erase 함수의 리턴값이 바로 삭제 원소 다음에 있는 원소 iterator이기 때문... for( Iterato

pml용 vim syntax 파일

pml용 vim syntax 파일 입니다. 이 파일을 vim의 syntax 폴더 안에 넣어두고, vim 폴더 안에 있는 filetype.vim 에 아래의 내용을 추가합니다. au BufNewFile,BufRead *.pmlfnc,*.pmlfrm,*.pmlobj setf pmlfnc 2007.11.16 $* 주석 처리한 것 --2007.12.20 기타 등등 추가. --2008.01.18 ...

[code project 펌]Hacking the CPropertySheet

돼지스머프 | 돼지스멒 http://blog.naver.com/bbk1999/90001777342 Hacking the CPropertySheet By Mustafa Demirhan Introduction In my applications, I usually need to change the default look and feel and the behavior of Property Sheets. Working with property sheets and pages is really a pain and you must do most of the work on yourself for non-standard operations (such as changing the coordinates of the buttons, adding new controls to the property sheet, ...etc). In this article, I tried to give as many tips and tricks as I can do. Before going in to the details, you should first create a CPropertySheet derived class - say CMyPropSheet. Lets begin with some simple things: Hiding Standards Buttons When our property sheet shows up, by default it has all the buttons visible and the Apply button is disabled. In general we don't need to use Apply button. To hide the apply button, you can simply use the following code: propsheet.m_psh.dwFlags |= PSH_NOAPPLYNOW; Ho

CDocument::DeleteContents

출처 행복하세요~ | 논스모커 원문 https://blog.naver.com/ttcoupe/20017784895 MFC Library Reference CDocument::DeleteContents Called by the framework to delete the document's data without destroying the CDocument object itself. //CDocument 객체 자체를 없에지 않고, document에 있는 내용을 지운다. virtual void DeleteContents( ); Remarks It is called just before the document is to be destroyed. It is also called to ensure that a document is empty before it is reused. This is particularly important for an SDI application, which uses only one document; the document is reused whenever the user creates or opens another document. Call this function to implement an "Edit Clear All" or similar command that deletes all of the document's data. The default implementation of this function does nothing. Override this function to delete the data in your document. //이 함수는 기본적으로 아무것도 하지않는다. 하지만 사용자의 document의 데이터를 지우기 위해서 재정의한다. Example // This example is the handler for an Edit Clear All command.

등고선 그리기

이번 작업을 하면서 등고선 그리는 일이 필요하게 되었습니다. 며칠동안 인터넷을 뒤져 가면서 등고선 그리는 루틴( 소스이면 좋겠다고 생각 함)을 찾아봤지만  이거다 싶은 것을 발견하지 못했습니다. 그나마 겨우 찾아낸것이 Kriging 알고리즘으로 등고선을 그린다는 것이었습니다. Kriging 알고리즘은 그리 복잡하지 않은 몇개의 식으로 표현되어 있었는데 이것을 어떻게 프로그래밍해야 할지 알수가 없었습니다. 다시 인터넷을 뒤지던 중 나의 상황에 맞는 루틴을 코드구루에서 찾을 수 있었습니다. 이것은 아주 단순했습니다. 저의 경우는 1mm 간격으로 놓여 있는 그리드의 측정점(x , y , z)들을 미리 알고 있는 상태였습니다. 아래 이미지는 측정 데이터들의 일부분을 캡쳐한 것입니다. TOP에서 봤을때 ISO로 봤을때 이 측정점들로 삼각망들을 형성할 수 있습니다. min z ~ max z의 간격을 7등분하였고 각 등분된 간격에 무지개 색상을 각각 할당하였습니다. 등분된 간격에 들어가는 삼각망을 할당된 색상으로 칠하기만 하면 되는 것입니다. 좀더 자세히 생각해 보면, 최초의 삼각망은 LEVEL( min z ~ max z를 등분하는 값)에 의해 분할이 일어나게 됩니다. 이렇게 분할이 일어날때 삼각망은 2개의 다각형으로 분할되는데 이 다각형을 다시 삼각형으로 나누어줍니다. $N$개의 정점을 가지는 다각형은 $N-2$개의 삼각형으로 나눌 수 있습니다. $N-1,i,i+1$의 3개의 정점을 가지고 삼각형을 생성한다고 생각하면 됩니다. $(i = 0,...,N-3)$ 이러한 작업은 모든 삼각망에 대해 모든 LEVEL에 걸쳐 수행하게 됩니다. 결과로 생기는 모든 삼각망들은 모든 LEVEL에 의해 나누어지게 됩니다. 삼각망들을 2D로 내려 할당된 색상으로 칠해주면 됩니다. 여담으로 소스포지에 보면 FMesh라는 프로그램이 있는데 이 프로그램을 분석해보면 3D 좌표를 가지고 먼저 삼각망을 구성하고 나서 앞서 이야기한 내용대로 삼각망

c++로) unicode를 multi-byte character로 변환하려고 하는데

출처 :   http://tong.nate.com/thisbe71/24531681 안녕하세요. 일단 문자세트, 테이블에 대해서 조금 이야기를 할까 합니다. SBCS(Single Byte Character Set) DBCS(Double Byte Character Set) MBCS(Multi Byte Charecter Set) WBCS(Wide Byte Charecter Set) 4종류의 테이블이 있습니다. 옛날 ASCII 코드라고 들어보신 적이 있으실까 모르겠습니다. 이넘들이 1바이트를 가지고 문자를 표현했었습니다. 1바이트니까 256개의 문자를 표현할 수 있지요. 그것이 저 위에 있는 SBCS입니다. 그러다가 한글도 써야 되고 일어도 써야 되고 한문도 써야 되지요... 그것을 위해서 만들어진 것이 바로 DBCS입니다. 한글을 쉽게 쓸 수 있어서 좋긴하지만 문제가 발생했습니다. SBCS와 DBCS가 호환이 되지 않았던 겁니다. 그래서 저거 두개 묶어 쓰자...라고 나온 것이 MBCS이구요. 하지만 MBCS 내부에서 호환이 되지 않았기 때문에 앗싸리 바이트를 여러개 써서 모든 문자를 표현하기 위해서 나온 것이 바로 WBCS입니다. multi-byte characater는 바로 MBCS이구요. 유니코드는 WBCS랍니다. 자~ 그럼 왜 WBCS에서 MBCS로 바꿔야 할까요. 그것은 바로 윈도우즈 운영체제 때문입니다. 윈도우즈 95, 98, me 계열, 9x계열들은 MBCS를 사용했었습니다. 그러다가 윈도우즈 2000 넘어가면서부터 WBCS를 사용하게 되었는데요. 물론 윈도우즈 2000이상급들에서도 MBCS를 사용할 수 있긴 하지만 9x계열에서는 WBCS를 사용할 수가 없죠. 프로그램의 운영체제간 호환성을 위해서 어쩔 수 없이 써야하는 것이랍니다. 여기까지 대략적인 문자세트를 설명했구요. 이제 답변을... 624b -> 이렇게 있으면 '手'이 뮨자가 나와야 한다는 건가여? ==> 네 그

SHBrowseForFolder 디폴트 경로 설정하기...

출처 : http://codeguru.earthweb.com/mfc/comments/5889.shtml [[ Starting SHBrowseForFolder from arbitrary directory is easy ]] This is very easy... // this is how we set the initial directory int CALLBACK MyBrowseCallbackProc( HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData ) { switch (uMsg) { case BFFM_INITIALIZED: ::SendMessage( hwnd, BFFM_SETSELECTION, TRUE, lpData ); break; } return 0; } void BrowseForDirectory( CWnd* pWndOwner, LPCTSTR title, CString& folderName ) { TCHAR path[MAX_PATH]; LPTSTR pFolderName = folderName.GetBuffer(folderName.GetLength()); BROWSEINFO browse; browse.hwndOwner = pWndOwner->GetSafeHwnd(); browse.pidlRoot = NULL; browse.pszDisplayName = pFolderName; browse.lpszTitle = title; browse.ulFlags = BIF_RETURNONLYFSDIRS; browse.lpfn = MyBrowseCallbackProc; browse.lParam = (LPARAM)pFolderName; LPITEMIDLIST pidl = SHBrowseForFolder(&browse); folderName.Relea

SHBrowseForFolder로 폴더 브라우징 하는 방법.

나만의 노트' ' | 나츠히메 http://blog.naver.com/iizumi/30002116144 폴더만 브라우징 해서 경로를 가져오는건데요. //---------------------------------------------------- bool MyApp::OpenPath( CString& outpath ) { char path[MAX_PATH]; memset(path,0,sizeof(char) * MAX_PATH ); BROWSEINFOA bi; bi.hwndOwner = GetSafeHwnd(); bi.pidlRoot = NULL; bi.lpszTitle = "경로를 입력해주세요"; bi.pszDisplayName = path; bi.ulFlags = BIF_RETURNONLYFSDIRS; bi.lpfn = NULL; LPITEMIDLIST idlist = SHBrowseForFolderA( &bi ); if ( idlist ) { SHGetPathFromIDListA( idlist, path ); outpath = path; return true; } outputpath = ""; return false; } //---------------------------------------------------- 물론 idlist가 NULL이면 취소를 했다는 거죵. 좀 더 자세한건 MSDN에서 SHBrowseForFolder 로 검색해 보시면 됩니당. 이거랑 이전에 올린 CFileFinder를 이용하면.. 특정 폴더를 지정하고, 그 폴더의 경로를 이용해, 하위 폴더의 파일목록을 만든다든지 검색을 한다든지 유용하게 쓰실 수 있습니당.. - .-

BuildAssist

일일 빌드를 위한 배치 파일을 보다 쉽게 만들기 위한 간단한 프로그램입니다. 컴파일러 파일 설정 : 커맨드 라인상에서 컴파일을 위한 프로그램을 각각 VC6.0 , .NET 2003 , VB6.0에 대해서 설정을 합니다. 패키지 파일 : 인스톨러 프로그램을 설정합니다. NSIS의 경우 : makensis.exe Window Installer의 경우 : DEVENV.EXE 패키지 파일을 설정합니다. 결과 파일을 저장할 폴더 : 컴파일 결과를 저장할 폴더를 설정합니다. 빌드할 프로젝트들... : 빌드할 프로젝트들을 설정합니다. Compiler : < VC6.0 , NET 2003 , VB6.0 > 중 하나 선택 Mode     : < Release  , Debug > 중 하나 선택 Project   : 프로젝트 파일 선택 OK 버튼 : 저장할 배치 파일 이름을 설정합니다. 첨부 파일

Doxygen - Visual Studio 6.0 에서 Doxybar쓰기

Seize the day | 더미 http://blog.naver.com/pokev25/80001993980 참조 URL - http://www.gpgstudy.com/gpgiki/DoxygenTutorial 1. 필요파일 다운로드 Doxygen - http://www.doxygen.org/index.html Doxybar - http://doxbar.sourceforge.net/ MS HTML help workshop - http://msdn.microsoft.com/workshop/author/htmlhelp 2. 설치 Doxygen과 help workshop은 setup진행 Doxybar는 적절한 위치에 압축을 풀어 놓는다. (위의 참조 URL에선 path설정이 필요하지만 setup을 한경우는 자동 설정된다.)     3. 환경설정 Doxygen - 기본 설정파일을 만들자 도스창을 열고 doxygen -g 기본파일 (doxyfile)이 생긴다 boxybar설정할때 필요하므로 doxygen폴더에 넣어두자 노트패드 같은것으로 이 파일을 열어서 OUTPUTLANGUAGE를 Korean으로 고친다. Doxybar - 퍼온다. 필요한 부분만 코멘트 처리함 Installation Do the following to install the tool: Start developer studio. From the "Tools" menu select "Customize...". Select the "add-ins and Macro Files" tab. Press "Browse" and select files of type "add-ins (.dll)". Browse to the location of doxbar.

IE 에서 DHTML Editing 컨트롤을 이용한 MFC OCX의 탭 키 처리 문제

IE 에서 DHTML Editing 컨트롤을 이용한 MFC OCX의 탭 키 처리 문제 현상 DHTML Editing 컨트롤을 Embed하여 MFC OCX를 작성한 경우, IE에서 이 컨트롤을 사용하면 DHTML Editing 컨트롤에서 방향 키 및 탭 키가 동작하지 않습니다. 위로 가기 원인 IE 컨테이너가 Accelerator Key에 대한 이벤트를 MFC OCX에서만 처리할 수 있도록 해주기 때문입니다. 즉, IE 에서 MFC OCX에 Embed된 DHTML Editing 컨트롤이 Accelerator Key인 탭 키 및 방향키에 대한 이벤트를 처리하지 못하기 때문입니다. 위로 가기 해결 방법 IOleInPlaceActivateObject 인터페이스를 이용하여 MFC OCX의 TranslateAccelerator 메소드가 호출되었을 때 DHTML Editing 컨트롤의 TranslateAccelerator 메소드가 강제적으로 호출되도록 합니다. 예제 코드 // MFC OCX의 이벤트 핸들러 BOOL CTest1Ctrl::PreTranslateMessage(MSG* pMsg) { IOleInPlaceActiveObject* piOleInplace; IUnknown* piUnknown; switch (pMsg->message) { case WM_KEYDOWN: case WM_KEYUP: switch (pMsg->wParam) { // 처리하려는 키에 대하여 case VK_UP: case VK_DOWN: case VK_LEFT: case VK_RIGHT: case VK_HOME: case VK_END: OutputDebugString ("Key down for Arrow

메모리 풀링

탑건매직 | 탑건매직 http://blog.naver.com/topgunmagic/120033903901 메모리 풀링? : 메모리 풀링이란 간단히 말해서 필요할때마다 new나 malloc을 사용하는것이 아니고, 필요한 만큼에 메모리를 미리 잡아두고 사용하는것을 말한다. 그럼 이것을 어따쓰냐.... 잦은 메모리 할당은 성능을 저하시킬수 있다. 따라서 한번에 미리 메모리를 잡아두고 사용한다면 성능면에서 매우 효율적일때 사용될수 있다. 위 MemPooler.h는 Edited from C8MemPool class (Hitel, gma 7 3) - 1CoinClear - 라는 사람이 만든건데, 메모리 풀링이 어떤식으로 돌아가는지 분석 해보도록 하자. 메모리 풀링은 언제 사용하나?? new와 delete가 빈번하게 반복 발생될때 메모리풀을 사용합니다. 게임에 사용자가 접속할때마다 사용자 객체를 new해주고 접속을 해제할때마다 delete를 해준다면 속도는 물론이고 메모리 단편화의 문제가 발생할 수 있기 때문에 시작할 당시 n개의 사용자 객체를 생성한뒤 접속할때 가져다 쓰고 접속을 해제할때 제거하지 않고 다시 사용할 수 있게 해주는 경우도 해당합니다. template<class Type> class MemPooler 템플릿 클래스를 사용하였습니다. 왜일까요? Type이 쓰이는 부분들을 일단 살펴 보도록 하겠습니다. m_nListBlockSize=sizeof(BlockNode)+sizeof(Type); 음...보시면 일단 사이즈를 잡는건데요. 그렇습니다. MemPooler 클래스 설계시 우리는 필요한 만큼의 메모리를 잡아야 하는데 이시점에서 이 필요한 만큼의 메모리가 어느정도인지 우리는 알수 없습니다. 이럴때 한번 사용했군요. Type* Alloc() 한 블럭을 사용할 시 사용가능한 메모리를 가리켜 그 주소를 리턴하는 함수인데요. 여기서 한블럭이라는건 차차 설명 하도록 하지요. 우리는 메모리풀링을 만들시 필요

다국어 버전 만들기

현재 진행중인 프로젝트가 어느 정도 끝이 보이는 시점에서 다국어 버전을 만들어 보기로 했습니다.(국내 회사에서 사용하는 것이므로 필요하지는 않겠지만...) 먼저 주 프로젝트에서 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"); }

The Joel Test: 나은 코딩을 위한 12단계 - 06/07/27 14:00

The Joel Test: 나은 코딩을 위한 12단계   -   06/07/27 14:00 글 : Joel Spolsky 번역 : B.K. Chung 정봉겸 감수 : Jang Han Goo 구장한 2000년 8월 9일 SEMA 에 대해서 들어보신 적이 있습니까? 소프트웨어 팀이 얼마나 잘하는지를 재는 나름대로 복잡한 시스템입니다. 앗, 아니! 그 링크를 누르지 마세요. SEMA를 "이해"만 하는데 아마 6년정도가 걸릴것입니다. 그래서 소프트웨어 팀이 얼마나 좋은지 등급을 매길 수 있는 - 좀 무책임하고 되는대로의 - 자체적인 버젼의 테스트를 만들었습니다. 이 테스트의 장점은 3분정도밖에 걸리지 않는다는 것입니다. 절약되는 시간으로 의대에 가서 공부할 수도 있을 것입니다. The Joel Test                    Source Control(소스 컨트롤)을 사용하십니까? 한번에 빌드를 만들어낼 수 있습니까? daily build(일별 빌드)를 만드십니까? 버그 데이타베이스를 가지고 있습니까? 새로운 코드를 작성하기 전에 버그들을 잡습니까? up-to-date(최신) 스케줄을 가지고 있습니까? spec(설계서)를 가지고 있습니까? 프로그래머들이 조용한 작업환경을 가지고 있습니까? 돈이 허락하는 한도내의 최고의 툴들을 사용하고 있습니까? 테스터들을 고용하고 있습니까? 신입사원들은