/*     오버로드 된 멤머 함수를 컨넥시 오류 나는 부분~     */
// 태인이형 알려주셔서 캄샤캄샤~

struct stFunc
{
     void Display() {
           // to do
     }
     void Display_text( const char* pszText ) const {
           // to do
     }
     void Display_text() const {
           // to do
     }
};

boost::signal< void( stFunc*, const char* ) > sig01;
boost::signal< void( stFunc* ) > sig02;

stFunc* pFunc = new stFunc;

/*
* 일반적인 모양
*  sig01.connect( &stFunc::Display_text );
*  오버로드된 멤버 함수를 컨넥할 시
*  sig01.connect( static_cast< 리턴형( 구조체나 클래스명::*)( 인자 ) > ( 연결할 멤버함수의 주소 )
*/

sig01.connect( static_cast< void( stFunc::* )( const char* ) const > ( &stFunc::Display_text ) );
sig02.connect( static_cast< void( stFunc::* )() const > ( &stFunc::Display_text ) );

sig01( pFunc, "테스트 문자열" );
sig02( pFunc );

delete pFunc;

/*   멤버 함수를 호출해서 사용하는 법.    */
// 함수 오버로딩시 문제점 발생!  아직 미해결 ㅋ

struct stFunc
{
     void Display() {
           // to do
     }
     void Display_text( const char* pszText ) {
           // to do
     }
};

int main( int argc, char* argv[] )
{
    // 인자가 없는 함수와 있는 함수
    boost::signal< void( stFunc* ) > sig01;
    boost::signal< void( stFunc*, const char* ) > sig02;

    // 함수 뒤에 () 빠지는 것을 주의. 함수포인터만 필요함.
    sig01.connect( &stFunc::Display );
    sig02.connect( &stFunc::Display_text );

    stFunc* pFunc = new stFunc;

    sig01( pFunc );
    sig02( pFunc, "출력할 문장" );

    delete pFunc;

    return 0;
}

#include <boost/signal.hpp>

struct stFunc
{
    void operator() () const {
        // to do
    }
};

int main( int argc, char* argv[] )
{
    // boost::signal< 리턴형( parameter1, param2, ... paramN ) > 시그널변수이름;

    // 지금은 함수 자체에 인자가 없으므로 전부 void() 형으로 시그널 형성
    // 구조체( 클래스 ) 자체를 연결.
    boost::signal< void() > sig01;
    sig01.connect( stFunc() );
    sig01();

    // 할당된( 정적 or 동적 ) Object( struct or class )에 연결
    boost::signal< void() > sig02;
    boost::signal< void() > sig03;

    stFunc     Func;
    stFunc*    pFunc;

    sig02.connect( Func );
    sig03.connect( *pFunc );

    sig02();
    sig03();

    delete pFunc;
}

UNICODE <-> UTF8 잡동사니 2009. 8. 17. 15:23

UTF - 8 의 표

사용자 삽입 이미지









//////////////////////////////////////////////////////////////////////////
한글의 경우
1110 xxxx
10xx xxxx
10xx xxxx

쉬프트 연산후
xxxx 0000   ( << 4 )
xxxx xx00   ( << 2 )
xxxx xx00   ( << 2 )

유니코드로 합치기
   xxxx 0000 0000 0000   ( <<8칸 밀기 )
          xxxx xx00 0000   ( <<4칸 밀기 )
 |              00xx xxxx   ( >>2칸 밀기 )
------------------------------------
   xxxx xxxx xxxx xxxx

/---------------------
110x xxxx
10xx xxxx

xxxx x000    ( << 3 )
xxxx xx00    ( << 2 )

  0xxx xx00 0000
 |       00xx xxxx
-----------------
  0xxx xxxx xxxx
-------------------------/

//////////////////////////////////////////////////////////////////////////

WCHAR wTest[200] = L"Test문자열 1번 입니다.";
char szAnsiText[200];

int size = WideCharToMultiByte( CP_UTF8, 0, wTest, -1, NULL, NULL, NULL, NULL );
WideCharToMultiByte( CP_UTF8, 0, wTest, -1, szAnsiText, size, NULL, NULL );

BYTE  byWords[4];     // UTF-8의 최대크기
wchar_t  szUniText[100];    // UTF -> UNICODE로 변경된 데이터 저장할 버퍼

int nLen = ( int )_tcslen( szAnsiText ); // 문자열의 전체길이
int iUniPos = 0;       // 유니코드 버퍼의 위치
int iAnsiPos = 0;       // Ansi 버퍼의 위치

while( iAnsiPos != nLen )
{
  byWords[ 0 ] = szAnsiText[ iAnsiPos ];

  // 0x0800 ~ 0xffff
  if( 0xe0 <= byWords[ 0 ] )
  {
   byWords[ 1 ] = szAnsiText[ ++iAnsiPos ];
   byWords[ 2 ] = szAnsiText[ ++iAnsiPos ];

   byWords[ 0 ] <<= 4;
   byWords[ 1 ] <<= 2;
   byWords[ 2 ] <<= 2;

   szUniText[ iUniPos ] =
    byWords[ 0 ] << 8 | byWords[ 1 ] << 4 | byWords[ 2 ] >> 2;
  }
  // 0x0080 ~ 0x07ff
  else if( 0xc0 <= byWords[ 0 ] )
  {
   byWords[ 1 ] = szAnsiText[ ++iAnsiPos ];

   byWords[ 0 ] <<= 3;
   byWords[ 1 ] <<= 2;

   szUniText[ iUniPos ] = byWords[ 0 ] << 3 | byWords[ 1 ] >> 2;
  }
  // 0x0001 ~ 0x007f
  else
   szUniText[ iUniPos ] = byWords[ 0 ];

  ++iUniPos;
  ++iAnsiPos;

}

// 널문자 추가
szUniText[ iUniPos ] = 0;

'잡동사니' 카테고리의 다른 글

무슨 게임 무슨 엔진  (0) 2010.01.10
장난칠때 써먹을 반한 잡지식?  (0) 2009.10.29
성향 테스트  (0) 2009.10.05
if( a == b == c )
{
}

의 결과는 무조건 false !!
( a == b ) 가 true / false 로 나오는데
그 값을 다시 c 와 비교하기 때문에
만약 c가 0이나 1이라면 우연찮게 true가 나올 가능성이 있다.
하지만 대부분 false가 나오겠지~

3개의 값이 똑같음을 비교하는건 귀찮지만 2개씩 비교해야 하나보다.
오늘 작업하면서 다른 사람이 짠 소스 였는데.
역시 매크로! 재밌다는걸 느꼈다.

#define DEFINE_OPTION_BOOL(NAME)   bool m_b##NAME##;
#define DEFINE_OPTION_BOOL_GETFUNC(NAME) inline const bool Can##NAME##() { return pSecured->m_b##NAME##; }
#define DEFINE_OPTION_INT(NAME)    int m_i##NAME##;
#define DEFINE_OPTION_INT_GETFUNC(NAME)  inline const int Get##NAME##() { return pSecured->m_i##NAME##; }

매크로를 쓴 이유는 기업비밀~!