std::string 의 CString::format 구현

std::string의 CString 따라잡기 2탄!!

format 구현
※ 주의 : 리눅스에선 정상작동이 안될수 있습니다!!!

<소스>

#include <stdarg.h> 

std::
string format_arg_list(const char *fmt, va_list args) 

    
if (!fmt) return ""

    int   
result -1, length 256
    char 
*buffer 0

    while 
(result == -1
    { 
        
if (buffer) delete [] buffer
        
buffer = new char [length + 1]
        
memset(buffer, 0, length + 1)
        
result vsnprintf(buffer, length, fmt, args)
        
length *2
    


    std::
string s(buffer)
    delete 
[] buffer
    return 
s


std::
string format(const char *fmt, ...) 

    va_list args
;
    
va_start(args, fmt)
    
std::string format_arg_list(fmt, args)
    
va_end(args)
    return 
s
}

출처 : http://blog.yurihan.net/70

이상!!

by 졸려요 | 2009/11/12 16:52 | VC++ | 트랙백 | 덧글(1)

std::string에서 CString::Replace() 기능 구현

std::string 편한점이 많아 쓰고 있지만 불편한점은 CString에 있는 함수들이 아직은 미비하다는것.

< 소스 >

#include "string"

void replacetext(std::string& strSamiHtml, LPCSTR szsrc, LPCSTR szdest)
{
    std::
string strsrc(szsrc);
    UINT upos strSamiHtml.find_first_of(strsrc);

    while 
(upos !std::string::npos)
    {
        strSamiHtml.erase( upos, strsrc.size() )
;
        strSamiHtml.insert( upos, szdest);
        upos strSamiHtml.find_first_of(strsrc);
    } 
}

//testcode
std::string strvalue("new<br>old");
::replacetext(strvalue, "<br>""\n");

출처 : http://blog.naver.com/alexnet?Redirect=Log&logNo=40026634624

이상!!

by 졸려요 | 2009/11/12 15:38 | VC++ | 트랙백 | 덧글(0)

C에서 java StringTokenizer 따라하기

 Java와 C를 넘나들며 프로그램을 하다보면 가끔 각자 편하던 기능들이 생각나곤 한다.
오늘은 java에서 StringTokenizer와 비슷한 기능이 필요해서 만들어 봤다.

버전별 방법이 다름.

VC 6.0용
AfxExtractSubString AIP이용

이상 버전
CString의 Tokenize함수 이용

사용예

AfxExtractSubString
        CString strFullText _T("1, 2, 3");
        
CString tok;
        int 
i, curPos0;

        
AfxExtractSubString(tok, strFullText, curPos, ',')curPos++;
        
tok tok.Trim();

        for
(tok !_T("")curPos++)
        {
            TRACE(tok)
TRACE("\n");
            
atoi((LPSTR)(LPCSTR)tok);

            
AfxExtractSubString(tok, strFullText, curPos, ',');
            
tok tok.Trim();
        
}


Tokenize함수
        CString tok, strTmp;
        int 
i, curPos0;

        
strTmp "1,2,3,4,5";

        
tok (strTmp.Tokenize(_T(","), curPos)).Trim();
        while 
(tok !_T(""))
        {
            TRACE(tok)
TRACE("\n");
            
atoi((LPSTR)(LPCSTR)tok);

            
tok (strTmp.Tokenize(_T(","), curPos)).Trim();
        
}

by 졸려요 | 2009/07/31 15:06 | VC++ | 트랙백 | 덧글(0)

(펌)간단한 유도탄 알고리즘

따라오기

총알이 유도탄일경우 캐릭터가 움직이는 곳으로 따라다녀야 한다. 아니면 캐릭터에게 펫이 있다고 하면 그 펫은 캐릭터가 가는곳을 계속 따라다닐 것이다.
우선 호드값을 너주기 위해 세팅을 해준다.  360 도의 값을 다 너주기 위해 360개의 배열을 선언한뒤  초기화를 해준다.

double sinTBL[360];
double cosTBL[360];

for(i=0; i<360; i++)
{
     sinTBL[i] = sin(i*0.0175)  ;
     cosTBL[i]= cos(i*0.0175) ;
}

초기화는 한번반 실행해 주면 된다.
완전 원에는 360도. 즉 2*pi 호도가 있다. 180도는 pi 호도.
컴퓨터 함수 sin() 과 cos()는 각도가 아닌 호도로 작동된다.

pi 호도를 수치로 표현 하면 3.14 이다..
360 도 = 2*pi = 6.28
180 도 = pi = 3.14
90 도 = pi / 2 = 1.57
57.295도 = pi / pi = 1
1도 = pi / 180 = 0.0175(반올림)

캐릭터 변수 Int 형 Cx, Cy 와 따라다니는 펫 변수 double 형 Px, Py...

// 캐릭터와 펫의 각도(라디언)

int temp ;        

temp = (int)( ( atan2(abs(Py-Cy), abs(Px-Cx) ) )*180 ) / 3.14;   

atan2 는 아크탄젠트 함수이다. 탄젠트의 경우 주기가 180도인 주기함수가 되므로 아크탄젠트를 정의할때는 탄젠트의 정의역을 -90도에서 90도 사이로 제한한다. 아크탄젠트의 정의역은 실수 전체가 되고 치역은 -90도에서 90도가 된다...  뭔말인지..ㅋ

내가 원하는 값이 안나오기 때문에 캐릭터와 펫이 서로 몇분면에 위치한지를 체크한후
값을 수정해 준다.

if(Cy - Py > 0)
{
    if(Cx - Px > 0)
        temp = temp + 90;
    else
        temp = 270 - temp;
}
else
{
     if(Cx - Px > 0)
        temp = 90 - temp;
    else
        temp = 270 + temp;
}

Px += sinTBL[temp]*2;
Py -= cosTBL[temp]*2;

// *2 에서  이 숫자를 늘릴수록 빨리 쫒아온다.

by 졸려요 | 2009/07/27 16:51 | Etc program | 트랙백 | 덧글(0)

오라클에서 order by와 rownum의 관계

테이블에서 order by로 소팅하고 원하는 상위 갯수만 가져오고자 할때 rownum을 쓰면 된다.

하지만 주의할점은 아래와 같이 sql문을 작성하면 rownum먼져 실행이 되고 order by가
나중에 실행되면서 원하는 결과가 나오지 않는다.
select * from 테이블명 where rownum < 4 order by num desc


원하는 결과가 나오게 할려면 rownum과 order by를 나눠주면 된다.
select * from (select * from 테이블명 order by numsc) where rownum < 4

즉, 정렬 실행 -> rownum실행 순으로 되도록 나눠준것.

이중 쿼리는 싫은데 다른 방법 없나 쩝... ;;;

by 졸려요 | 2009/07/24 17:22 | 업무 | 트랙백 | 덧글(0)

◀ 이전 페이지          다음 페이지 ▶