'윈도우프로그래밍'에 해당되는 글 4건

  1. 2013.03.06 소코반 게임
  2. 2012.10.17 나눔로또 당첨번호 추출기 1
  3. 2012.08.16 전처리기를 활용하여 디버그시에만 TRACE를 사용한다.
  4. 2012.04.09 bool과 BOOL의 토픽
윈도우프로그래밍2013. 3. 6. 15:37

레지스트리, 충돌체크, 파일IO부분과 형변환 등등을 테스트하다가 소코반을 완성해 버렸다.

나름 1~35판 까지 있고 게임 관련된 부분 디버그나 테스트가 이루어 지진 않았지만

몇 판 하는데는 문제 없을 듯... 요즘 이러고 놀아요~

 

VS2008로 개발된 실행파일을 실행하려면 아래의 재배포 패키지를 실행하여 윈도우에 API를 등록해야 합니다.

vcredist_x86.exe

 

실제 게임실행파일입니다...

소코반.zip

Posted by 버터백통
윈도우프로그래밍2012. 10. 17. 11:29

최근에 로또를 하고 있는데 구매시 랜덤으로 번호를 주었더니...

너무 확률이 낮아서 나름 그 동안의 담첨 번호 횟수순으로

랜덤 번호를 추출할 프로그램을 만들었습니다.

필요하신 분 내려 받아 사용하세요~

 

그리고 유해한 코드는 안 들어 갔으니까 안심하세요~

 

vcredist_x86.exe

(VS2008 재배포 패키지)

 

LotteryNumberSampler.exe

Posted by 버터백통
윈도우프로그래밍2012. 8. 16. 10:50

AS3에서는 별도의 Deber를 만들어 상태가 Debug가 true인 경우에만 실행하도록 사용하였다.

물론 C++에서도 이처럼 할 수 있지만 전처리기를 활용해본다.

 

우선 디버그 상태를 파악할 수 있는 _DEBUG라는 것을 C런타임 라이브러리에서 제공한다.

이를 검사하기 위해서는 아래와 같은 조건문을 사용한다.

 

[ 조건 대상의 값이 TRUE인 경우 ]

#ifdef _DEBUG

실행문

#endif

조건문 if이다 루틴은 우리가 알고 있는 그대로이다.

 

위처럼 DEBUG시에만 TRACE가 출력되도록 하고 싶으면 아래와 같이 하면 된다.

#ifdef _DEBUG

TRACE("RUN");

#endif

 

흔히 사용하는 조건문 처럼 else와 else if도 사용이 가능하다.

#ifdef _DEBUG

실행문1

#elseif XXX

실행문2

#else

실행문3

#endif

 

또한 논리연산자는 아래와 같이 사용한다.

#if defined (_DEBUG) || ( XXX )

실행문1

#elseif XXX

실행문2

#else

실행문3

#endif

 

 

[ 조건 대상의 값이 FALSE인 경우 ]

대상의 값이 FALSE인 경우에는 아래와 같이 조건문을 달리(n이 추가된다) 사용한다.

#ifndef XXX
    
실행문

#endif

위의 경우는 XXX 상태가 FALSE일 때 실행문이 실행한다.

 

Posted by 버터백통
윈도우프로그래밍2012. 4. 9. 12:04

어느날 문득 소스코드를 보다보니 어떤 것은 BOOL을 사용하여 TRUE와 FALSE를 사용한 것이 있는가 반면

어떤 소스는 bool을 사용하여 true와 false를 값으로 사용하는 것들을 보았다...

몇 번을 겪다보니 왜 이 두 가지 데이터형이 존재하는가?에 대하여 의문이 들기 시작했다.


우선 BOOL은 MFC에서 int를 재정의한 키워드이다. 

C는 함수의 성공과 실패의 값을 0과 -1을 리턴하지만 boolean이라는 자료형을 제공하지 않았다.
이를 사용하던 WIN32 API는 자체적으로 BOOL키워드를 만들어 제공하였으며 원형을 찾아보면 

typedef int    BOOL와 같이 정의되어있다. 즉 int형의 재정의이다.

또한 이것에 사용되는 TRUE와 FALSE 키워드의 경우도 #define FALSE   0 #define TRUE    1로 정의 되어있다.


1995년에 자바가 공식 발표 후에 C++에 bool이라는 데이터 형이 추가되었다고 한다.

이후 MFC에도 bool자료형을 사용할 수 있게 되었다. 


의문이 들었다..."비슷하다고 마음대로 쓸수있는가?" 이다. 

우선 용량을 비교하면 bool의 승리이다.

BOOL은 int형으로 4바이트의 크기를 갖는다.

bool은 단지 1바이트의 값을 갖는다.


단지 참과 거짓을 비교하기 위해 4바이트를 사용할 필요는 없다.

sizeof()를 사용하여 여기까지 검증해 보았다면 bool형을 사용할 것 같다.


또한 int의 값을 사용하는 BOOL은 제대로 초기화 하지 않으면 참과 거짓의 값을 비교하는데 신뢰가 떨어진다.

그리고 TRUE가 true를 의미하지 않을 수 있다.

void myFunc()

{

BOOL isSuccess = connectFunc();//실패:0, 성공:0이 아닌 다른 값

if( isSuccess == TRUE ){

A Routine;

}else if( isSuccess == FALSE ){

B Routine;

}

}

물론 명시적으로  isSuccess != 0이 아닌 isSuccess == TRUE 으로 두어 문제를 만들어낸 코드이지만,

반드시 1이 아닌 다른 값이 넘어올 수 있다는 것을 증명하는 것이 중요하다. 

C Main같은 경우 0과 -1을 리턴하므로 그러한 값을 바로 리턴한다면 연결 성공 후 A Routine이 실행하지 않을 수 있다.


이런 저런 상황으로 보면 bool을 사용해야 맞는가? 그것도 확실하지 않다.

자료를 찾던 중 어셈블러의 연산에 대하여 접하게 되었다.


bool은 어셈블리 연산에서 사용되는 연산 바이트 코드수가 더 많아진다고 한다. 

32비트 컴퓨터에서 int를 0과 비교하는데는 cmp명령어 하나로 4바이트가 소모되는 반면

bool의 treu/false를 비교하기 위해서는 movxz, cmp명령어를 사용해야하므로 7바이트가 소모되어 BOOL보다 3바이트를 더 소비한다.


* bool 을 true 와 비교

004113B7 0F B6 45 F8        movzx      eax,byte ptr [bool Object] 

004113BB 83 F8 01             cmp         eax,1 

004113BE 75 07                   jne           wmain+47h (4113C7h) 


* BOOL 을 TRUE 와 비교

004113C7 83 7D E0 01        cmp         dword ptr [BOOL Object],1 

004113CB 75 07                   jne           wmain+54h (4113D4h) 



결론은 bool과 BOOL의 호불호가 갈리는 시점에서 난 BOOL을 사용해야하지 않나 싶다.

bool이 미약하지만 용량을 줄여주는 반면 데이터를 옮겨 저장해두고 비교하기 위한 루틴 때문에 비효율적이다에 한 표를 던져 본다.










Posted by 버터백통