블로그 이미지
Every unexpected event is a path to learning for you. blueasa

카테고리

분류 전체보기 (2809)
Unity3D (865)
Programming (479)
Server (33)
Unreal (4)
Gamebryo (56)
Tip & Tech (234)
협업 (61)
3DS Max (3)
Game (12)
Utility (140)
Etc (98)
Link (32)
Portfolio (19)
Subject (90)
iOS,OSX (55)
Android (16)
Linux (5)
잉여 프로젝트 (2)
게임이야기 (3)
Memories (20)
Interest (38)
Thinking (38)
한글 (30)
PaperCraft (5)
Animation (408)
Wallpaper (2)
재테크 (18)
Exercise (3)
나만의 맛집 (3)
냥이 (10)
육아 (16)
Total
Today
Yesterday



1. 개요

카툰랜더링이나 캐릭터 선택효과에 주로 쓰이는 실루엣 기법을 알아본다.

 

2.경계선 메쉬 만들기

메쉬를 구성하는 모든 edge들을 퇴축 사각형(넓이가 0인 사각형)으로 재구성한다.

 A        B
 *--------*
 |  edge  |
 *--------*
 C        D

 

초기에 A==C , B==D 이 다.

 

이부분은 silhouetteEdges.cpp,silhouetteEdges.h가 처리를 해준다.

 

SilhouetteEdges객체 초기화는 아래와 같이  메쉬를 넣어서 만든다.

ID3DXBuffer* adjBuffer = 0;
D3DXCreateTeapot(Device, &Teapot, &adjBuffer); 
OutLineShader::g_pMesh = new SilhouetteEdges(Device, Teapot, adjBuffer);
SAFE_RELEASE(adjBuffer);

 

랜더방법은 아래와같이 쉐이더 적용후에 render함수를 호출해준다.

 

pd3dDevice->SetVertexShader(OutLineShader::g_pShader);

...

OutLineShader::g_pMesh->render();

 

 

 

3. 실루엣 외각선 구분하기

두개의 면을 공유하는 외각선이 있을때 관찰자 기준으로 두개의 면이 서로 다른방향을 보면 그 외각선은 실루엣 외각선이다.

이부분은 outline.hlsl 이 처리한다.

 

 

4. 결론




출처 : http://gbox2.blog.me/100050813839

반응형
Posted by blueasa
, |

매크로는 C와 C++에서 제공되는 꽁수같은 기능이라고 할 수 있습니다.

꽁수같다라고 한 이유가  매크로는 사용자의 편의와 동시에 많은 위험성을 초래하기 때문이죠.

그래서, 대부분의 서적에서는 매크로의 사용을 자제하고 인라인(inline)과 상수형(const)을 더 지향하기도 합니다.

 

하지만, 이는 단순히 매크로의 위험성 때문이며 그 위험성의 간단한 예를 들자면,

 

#define POW( A ) A * A        // 정의했을 경우

...

POW( 10 + 10 )                // 사용자의 의도는 20 * 20 입니다.     하지만 결과는,

10 + 10 * 10 + 10             //10 + 100 + 10 = 120 이죠.

 

또한, 상수형 같은 경우는 디버깅이 불가능하다는 점도 있죠. 최근에 좋은 개발 툴은 매크로 변수를 추적도 가능하다고 합니다만... 비주얼 스튜디오 2008에서도 아직 안되더군요. :|

 

어쨌든, 그런 위험성을 제거할 수 있고 개발자 편의로 매크로를 마음껏 사용할 수 있다면, 구지 매크로를 사용을 자제할 필요가 없다고 봅니다.

 

결론은, 매크로의 사용여부는 개발자 자신에게 넘기도록 하겠고, 오늘은 매크로의 비법들에 대해서 한번 살펴보도록 하겠습니다.

매크로 사용여부는 다 알고 계신다고 가정하고, 사용 설명은 따로 하지 않겠습니다. 간단한 예를 보면 쉽게 이해가 될 겁니다.

 

#1) 열거형을 문자열로

 #define CaseEnum( A )      case( A ) : LogMsgToFile( #A )

 

switch( msg ) {

  CaseEnum( MSG_One );

    ...

    break;

  CaseEnum( Msg_Two );

    ...

    break;

  default:

    ...

    break;

}

 

/*************컴파일 전처리가 끝나면, 위의 소스는 다음과 같이 대체 됩니다.***********************/

 

switch( msg ) {

  case( MSG_One ): LogMsgToFile( "MSG_One" );

    ...

    break;

case( MSG_Two ): LogMsgToFile( "MSG_Two" );

    ...

    break;

  default:

    ...

    break;

}

 

 #2) 두 인자를 하나의 값으로 합치기

#define CAT( A, B )    A ## B

 

value = CAT( 1, 2 );

 

/*************컴파일 전처리가 끝나면, 위의 소스는 다음과 같이 대체 됩니다.***********************/

 

value = 12;

 

 #3) 표준 assert에 의미있는 메세지 추가하기

#define ASSERT_MSG( A, B )  assert( a && b )  

 

ASSERT_MSG( time > 0, "time must be bigger than zero" );

 

/*************컴파일 전처리가 끝나면, 위의 소스는 다음과 같이 대체 됩니다.***********************/

 

assert( time > 0 && "time must be bigger than zero" ); 

 

//사용에 있어서 큰 차이는 없지만 매크로가 더 사용자 직관적이지 않나요?

 

 #4) 컴파일 시점의 assert

//애초에 제한 조건에 벗어나면 컴파일 오류를 발생 시킵니다.

#define CASSERT( A ) typedef char __C_ASSERT__[ (A) ? 1: -1 ]

 

CASSERT( sizeof( MyEnum ) == sizeof( unsigned int ) );

 

/*************컴파일 전처리가 끝나면, 위의 소스는 다음과 같이 대체 됩니다.***********************/

 

//만약 MyEnum의 크기가 16이라고 가정했을 때,

typedef char __C_ASSERT__[ ( 16 == 4 ) ? 1: -1 ]

 

16 == 4는 거짓이며 따라서 __C_ASSERT[ -1 ] 이라는 형을 정의하려고 합니다.

하지만, -1의 크기의 배열 정의는 컴파일러 입장에서 불가능하기 때문에 잡아낼 수 있죠. 

 

#5) 배열의 원소를 구하기

//자바 같은 경우는 배열의 원소 갯수를 알 수 있지만 C/C++ 에서는 기본적으로 제공되진 않습니다. 

#define NUM_ELEMENT( A ) ( sizeof( A ) / sizeof( ( A[ 0 ] ) )

 

int a[ 10 ]

int nElement = NUM_ELEMENT( a );

 

/*************컴파일 전처리가 끝나면, 위의 소스는 다음과 같이 대체 됩니다.***********************/

 

int a[ 10 ]

int nElement = 40 / 4;

 

#6) __LINE__을 문자열로

// 기본적으로 정의되어 있는 유용한 매크로들 입니다.

__LINE__ // 컴파일 시점의 행 번호를 의미하는 정수

__FILE__ // 컴파일 되는 파일 이름을 담은 문자열

__DATE__ // 컴파일 될 때의 날짜를 담은 문자열

__TIME__ // 컴파일 될 때의 시간을 담은 문자열

 

//이들을 디버깅 시 유용히 활용할 수 있습니다.

#define TO_MSG( X ) #X

 

#define __FILELINE__ __FILE__" ( " TO_MSG(__LINE__) " ) "           //VC++에서는 안될 수도 있음

 

/*************컴파일 시 다음과 같이 출력됩니다.***********************/

c:\project\main.cpp ( 105 )

 

 

 

-참고 : Game Programming Gems 3 ( 정보문화사 )-


 
[출처] 매크로 마법 (Macro)|작성자 Hermet

반응형
Posted by blueasa
, |

[펌] !!a

Tip & Tech / 2011. 6. 8. 01:41

최근 어느 오픈 소스를 살펴 보다가 a = !!b 와 같은 코드를 보게 되었습니다.

 

곰곰히 생각해보니... 그래도 도대체 왜 하는건지? -_-a

 

a와 b의 타입이 unsigned char라고 하면, 결국 a = !!b 는 a = b 인거잖아?

 

 

사실 일부 c와 같은 언어는 boolean 타입을 별도로 지원하지 않으므로,

 

2바이트의 char형을 이용하며, 엄밀히 boolean의 0 과 1 이라는 두가지 상태 그 이상의 것이 될 수도 있는 것이지요.

 

즉, b는 0 ~ 255 사이의 값이 될 수도 있으며

 

그래서 !!b는 b가 어떠한 값이든 간에 0이 아닌 이상 b의 값을 1로 바꾸어 줄 겁니다.

 

b 가 25 라고 가정할 때,

!b 는 0

!!b 는 1

 

오호...

 

그럼 a = !!b 대신 a = b를 이용했을 땐, 어떤 문제가 발생할 수 있을까?

 

 

#define TRUE 1

#define FALSE 0

 

typedef unsigned char BOOL;

 

BOOL sound_state = FALSE;

 

void set_sound_state( BOOL state ) {

    sound_state = state;

}

 

BOOL get_sound_state() {

   return sound_state;

}

 

void test() {

    

    //사용자가 실수로 TRUE 대신 임의의 값을 집어 넣었습니다.

    //그런다고 해도 컴파일 오류는 안나고 심지어 컴파일 경고도 발생하진 않겠죠.

    set_sound_state( 123 );

   

     //결국, 기대하던 OK는 출력될리가 없습니다.

     if( get_sound_state() == TRUE ) {

        printf("OK!\n");

     }

 

}

 

사용자는,  값이 있으면 TRUE이겠지 라고 충분히 착각할 수도 있습니다.

 

결국, 우리가 정의한 TRUE는 1이기 때문에  123 == 1 비교식에서 실패나겠죠.

 

따라서, 다음과 같이 수정을 해준다면

 

 

void set_sound_state( BOOL state ) {

    //심지어 state가 123 이어도 값을 1로 바꿔줍니다.

    sound_state = !!state;

}

 

자, 이제 만사 OK!


[출처]
 !!a|작성자 Hermet

반응형
Posted by blueasa
, |

간단히 메모리 릭 발생여부를 알아내고 이를 해결하는 방법에 대해서 알아봅시다.

 

이는 MS 사에서 CRT(C Runtime) 라이브러리로 제공해는 CRTDBG 를 이용할 겁니다.

생각보다 쉬운 반면 그 기능은 막강하지요.

 

일단 프로그램 정의부에 다음과 같이 추가합니다.

 

#include <crtdbg.h>

#define CRTDBG_MAP_ALLOC

 

#ifdef _DEBUG

#define new new( _NORMAL_BLOCK, __FILE__, __LINE__ )        //궁금하시면 제 게시글 중 <매크로 마법> 편을 보세요.

#endif

 

이제 메인 진입 부 처음에 다음과 같이 선언합니다. 일반 main() 이라고 가정합니다. 물론 WinMain() 일 수도 있습니다.

 

void main() {

 

    _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );

 

    //  .... 메모리를 동적 할당하는 무언가의 작업을 하겠죠

 

}

 

추가로 설명하자면, _CrtSetDbgFlag 설정 비트 필드 값은 다음과 같습니다.

 

_CRTDBG_ALLOC_MEM_DF : 디버그 힙 메모리 할당을 허용합니다. 또한 _CLIENT_BLOCK과 같은 사용자 정의 메모리 블럭을 사용합니다.

 

_CRTDBG_LEAK_CHECK_DF : 프로그램 종료 시 자동으로 메모리 릭을 찾고 이를 출력해 줍니다. 이는 _CrtDumpmemoryLeaks 함수를 호출한 것과 같은 결과입니다.

 

이제 프로그램을 디버그 모드로 실행하고 종료합니다. 만약 동적 메모리 해제를 제대로 안해줬다면 다음과 같은 결과가 결과 화면에 출력됩니다.

 


 

우리에게 필요한 것은 바로 빨간색 선을 그은 정보입니다. 우리는 이 번호를 이용해 메모리 릭이 일어나는 부분을 찾아갈 수 있습니다.

그러나  중요한 점은 똑같은 환경에서 다시 실행했을 때도 메모리 릭 현상 결과가 같아야 한다는 점입니다. 그렇지 않으면, 매번 실행할 때마다 메모리 릭이 발생한 위치가 달라지고 따라서 위 번호도 달라져 버립니다.  따라서, 다른 작업을 하지 마시고 디버깅 작업만 하시길 바랍니다.

 

일단 위 9637 번호를 이용해서 메모리 릭이 일어나는 곳을 찾아가겠습니다. 이제 다시 main 첫부분에 다음과 같이 추가합니다.

 

void main() 

 

     _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );

    _CrtSetBreakAlloc( 9637 );

 

    //  .... 메모리를 동적 할당하는 무언가의 작업을 하겠죠

 

}

 

그리고 다시 디버그 모드로 실행을 하면 9637에 지시하는 똑같은 메모리 번지를 알아서 브레이크 포인터를 걸어줍니다.

우리는 그 부분의 소스를 보고 콜 스택을 추적해 가면서 메모리 릭을 감지하고 해결할 수가 있죠.

 

이런식으로 출력창에 출력되었던 다른 메모리 릭도 모두 찾아 해결하시면 됩니다.

 

 

릴리즈 배포 전, 메모리 책임은 프로그래머의 미덕이지 않을까요?

 

 

 

- 참고 : MSDN -


 
[출처] C Runtime 환경의 메모리 릭 잡는 방법 ( Memory Leak )|작성자 Hermet

반응형
Posted by blueasa
, |

1. 개요

_CrtDumpMemoryLeaks() 라는 함수를 이용해서 메모리 누수와 누수 지점을 알아내는 기법을 알아본다.

 

2. 탐지하기


#define CRTDBG_MAP_ALLOC


#include <crtdbg.h>

 

void main()

{

   char *ptr = new char[20];

 

   _CrtDumpMemoryLeaks();

}

 

 

 

여기서 {100} 라는 숫자를 보자...

{100 } 이라는 위치에서 할당받은 메모리가 해제가 안된체로 남아있다는 말이기 때문에 그위치에서 브래이크걸도록 만들면

원인을 일으킨 위치를 알아낼수있다.

 

 

void main()

{

  _CrtSetBreakAlloc(100);

  

  char *ptr = new char[20];

 

   _CrtDumpMemoryLeaks();

}

 

 

CrtSetBreakAlloc함수를 시작위치에 두고 다시 컴파일 하여 실행을 시켜보자.

 


 

 

  char *ptr = new char[20]; 위치에서 브래이크 걸릴것이다.

 

이런식으로 메모리 누수를 잡아낼수있다.

 

 

 

 

3. 주의사항

 

mfc용 어플리캐이션은 자동으로 메모리 누수 탐지가 되지만 일반 원도우 어플이나 콘솔어플은 이방법을 사용 해야만 메모리 누수를 알수있다.

 

_CrtDumpMemoryLeaks(); 가 호출되는 시점에서 해제 안된 메모리를 덤프하므로 꼭 프로그램 종료 직전에 써줘야 정확한 메모리 누수여부를 알수잇다.

 

_CrtDumpMemoryLeaks();

delete somePtr;

 

이렇게 되면 메모리 릭이 덤프된다.

 

또한

STL 사용시 제데로 릭을 검출 하지못하고 무조건 메모릭으로 판단하는 경우가 있다.

 

void main()

{

  std::string str("http://jga.or.kr");
  _CrtDumpMemoryLeaks(); 
}

 

이코는 문제가 없지만 str이 아직 중괄호 범위를 벋어나지 않았으므로 여전히 해제가 안된것으로 간주하여 메모릭으로 출력한다.

 

이때는 ::_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); 를 사용해서 릭을 검출할수있다.

 

void main()

{

  ::_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);

  std::string str("sasa");

  char *ptr = new char[20];

  
  //_CrtDumpMemoryLeaks(); 
}

이렇게 해주면 str에 대해서는 메모리릭이 발생하지않는다.


출처 : http://cafe.naver.com/jcga/883

반응형
Posted by blueasa
, |
반응형
Posted by blueasa
, |
반응형
Posted by blueasa
, |

아래는 해결방법을 찾아다니다 데브피아에서 발견한 글입니다.

[증상]
OS : Win7 x64
프로그램 : VS2008 x86으로 제작

프로그램을 만들어서 배포를 했는데 팀원(Win7 x64)의 컴퓨터에서 side-by-side 에러 어쩌고 하면서 실행이 안됐습니다.

그래서 열심히 검색하다가 데브피아에서 아래와 같은 글을 발견했는데..

아래 글을 보고 생각하다보니 Win7 x64에서 자동업데이트를 해봤자 재배포 패키지가 x64만 깔린다는 생각이 들어서

Microsoft Visual C++ 2008 서비스 팩 1 재배포 가능 패키지 ATL 보안 업데이트 x86 버전을 받아서 직접 깔았더니 잘 실행 되네요.

아래 글이 도움 많이 됐습니다. =ㅅ=

Microsoft Visual C++ 2005 서비스 팩 1 재배포 가능 패키지 ATL 보안 업데이트
http://www.microsoft.com/downloads/ko-kr/details.aspx?FamilyID=766A6AF7-EC73-40FF-B072-9112BAB119C2

Microsoft Visual C++ 2008 재배포 가능 패키지 ATL 보안 업데이트
http://www.microsoft.com/downloads/ko-kr/details.aspx?familyid=8B29655E-9DA4-4B6B-9AC5-687CA0770F93&displaylang=ko

Microsoft Visual C++ 2008 서비스 팩 1 재배포 가능 패키지 ATL 보안 업데이트
http://www.microsoft.com/downloads/ko-kr/details.aspx?familyid=2051A0C1-C9B5-4B0A-A8F5-770A549FD78C&displaylang=ko





VC 2005,2008 ATL관련 보안업데트가 있습니다.

일단 설치를 보류하세요.

자동업데이트도 막으십시요.

 

 

전 2008을 사용중인데. 어제 VC관련 업데이트가 떴길래 무심코 업데이트를 했습니다.

그리고 오늘 수정건을 업체에 배포했는데 죽어도 실행이 안되길래

따로 테스트를 해보았습니다.

 

결론부터 말씀드리면 업데이트3건은

2005, 2008 재배포 패키지(sp1일경우는 따로..) 관련

vs 2008관련

3가지가 설치되는데요.

 

이게 배포시 기본 2008하고 sp1이 다르듯이 아예 재배포 패키지가 다릅니다.

즉 dll버젼이 다르죠.

 

2008 기본 버젼이 9.0.21022.8이고

sp1이 9.0.30729.1

이번 업데이트로 (sp1) 9.0.30729.4148

 

dll버젼이 달라서 재배포 패키지를 최신버젼으로 다시 설치해야됩니다.

 

여기서 젤큰 문제 세가지는

1. 2005,2008 재배포 관련 설치는 추가/제거에 존재하는데 삭제해도 똑같다.

-> vs 2008 sp1관련 업데이트 삭제가 없다.

 

2. 윈도우 복원을 했는데요. 똑같이 문제가 발생하더란 겁니다.

-> 설치된 목록에도 없고 업데이트 해달라고 떡하니 뜨는데도 말이죠;

 

3. 2005부터 재배포 패키지로 바뀌었지만 설치된 폴더에서 필요한 몇개의 파일만 같이 포함하면

문제없었는데 이번엔 아예 그게 안먹힙니다. 제결론으로 그 이유는

 

manifest 명시를 보면

 

기존 sp1을 보면(mfc사용시)

 

 <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel level="requireAdministrator" uiAccess="false"></requestedExecutionLevel>
      </requestedPrivileges>
    </security>
  </trustInfo>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type="win32" name="Microsoft.VC90.CRT" version="9.0.30729.1" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
    </dependentAssembly>
  </dependency>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type="win32" name="Microsoft.VC90.MFC" version="9.0.30729.1" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
    </dependentAssembly>

 

9.0.30729.1 버젼의 crt와 mfc라이브러만 명시되어 있지만

 

이번 업데이트로는

  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel level="requireAdministrator" uiAccess="false"></requestedExecutionLevel>
      </requestedPrivileges>
    </security>
  </trustInfo>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type="win32" name="Microsoft.VC90.CRT" version="9.0.30729.4148" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
    </dependentAssembly>
  </dependency>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type="win32" name="Microsoft.VC90.MFC" version="9.0.30729.4148" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
    </dependentAssembly>
  </dependency>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type="win32" name="Microsoft.VC90.CRT" version="9.0.30729.1" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
    </dependentAssembly>
  </dependency>

 

9.0.30729.1과 9.0.30729.4148 CRT를 둘다 필요로 합니다. 고로 9.0.30729.4148 dll만 포함하면 실행이 안되겠죠.

 

결론.

아직 정확한 문서를 못봐서 atl관련 뭐가 업데이트 됐는진 모르지만 설치하지마세요 ㅡ.ㅡ;

이미 설치하셨다면 업데이트된 pc에서 컴파일한 파일 배포시는 재배포 패키지를 바꿔야합니다.

아예 모든 재배포 패키지를 최신꺼로 바꿔야합니다;

 

 

sp1용 재배포 패키지 주소 올려드립니다. 한글로는 아직검색 안되는듯 하네요.

Microsoft Visual C++ 2005 Service Pack 1 Redistributable Package ATL Security Update

http://www.microsoft.com/downloads/details.aspx?familyid=766A6AF7-EC73-40FF-B072-9112BAB119C2&displaylang=en

 

Microsoft Visual C++ 2008 Service Pack 1 Redistributable Package ATL Security Update

http://www.microsoft.com/downloads/details.aspx?familyid=2051A0C1-C9B5-4B0A-A8F5-770A549FD78C&displaylang=en

 

 

제가 겪은 일을 일단 빨리 올려봅니다.

댓글로 잘못된 부분은 알려주세요.

업데이트된 내용도 올려주심 감사.


출처 :  http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=51&MAEULNo=20&no=8351&ref=8351

반응형
Posted by blueasa
, |

#include <iostream>
#include <list>
using namespace std;

 

template<typename T> 
class Stack
{
public:
 Stack() : m_bLIFO(true) { Clear(); }

 // 저장 방식을 설정한다.
 void SetLIFO( bool bLIFO ) { m_bLIFO = bLIFO; }

 // 초기화 한다.
 void Clear()
 {
  if( false == m_Datas.empty() )
   m_Datas.clear();
 }

 // 스택에 저장된 개수
 int Count() { return static_cast( m_Datas.size() ); }

 // 저장된 데이터가 없는가?
 bool IsEmpty() { return m_Datas.empty(); }


 // 데이터를 저장한다.
 void push( T data )
 {
  m_Datas.push_back( data ); 
 }

 // 스택에서 빼낸다.
 bool pop( T* data )
 {
  if( IsEmpty() )
  {
   return false;
  }


  if( m_bLIFO )
  {
   memcpy( data, &m_Datas.back(), sizeof(T) );
   m_Datas.pop_back();
  }
  else
  {
   memcpy( data, &m_Datas.front(), sizeof(T) );
   m_Datas.pop_front();
  }

  return true;
 }

private:
 list<T> m_Datas;
 bool  m_bLIFO; // true 이면 후입선출, false 이면 선입선출
};

 

void main()
{

 Stack<int> Int_Stack;

 Int_Stack.SetLIFO(true);

 Int_Stack.push(10);
 Int_Stack.push(20);
 Int_Stack.push(30);

 int Value = 0;
 Int_Stack.pop(&Value);
 //마지막에 넣은게 처음 나온다.
 cout << "Last In First Out pop : " << Value << endl <<  endl;
 
 //데이터 초기화
 Int_Stack.Clear();

 //FIFP로 설정
 Int_Stack.SetLIFO(false);

 Int_Stack.push(10);
 Int_Stack.push(20);
 Int_Stack.push(30);

 Int_Stack.pop(&Value);
 //처음에 넣은게 처음 나온다.
 cout << "First In First Out pop : " << Value << endl <<  endl;

}

 출처 : http://cafe.naver.com/jgcafe/694

반응형
Posted by blueasa
, |
반응형

'Etc' 카테고리의 다른 글

JSON  (0) 2011.06.16
임금체불 시뮬레이션 (이미지)  (0) 2011.05.31
말잘하는 50가지 비결  (0) 2011.04.24
[M/V] Sunshine Girl  (0) 2011.03.31
저렴한 거북목 피는 스트레칭  (0) 2011.02.12
Posted by blueasa
, |