C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[60383] Re:[질문] 이상한 매크로 동작... ? (HexToDecimal 변환 시..)
제리압빠. [kamizen] 1266 읽음    2010-03-04 15:31
음.. 팀작업이라서.. 딴 사람 작업 분량이 안끝나서.. 심심하던 차에 이걸 봤네용...

그냥 심심해서 함 만들어봤습니다..

key_map 변수를 전역으로 놓고 , 초기화 루틴도 메인으로 빼면 실행마다 처리 안하고 처리 되겠네요..
한자리씩 세팅하는게 거시기 한거 같아서요..
성호님 StrToInt 한방에 내부 처리 되는 거지만 ㅎㅎ 그냥 심심해서 만들어봤습니다.

  
//---------------------------------------------------------------------------
#include 
#pragma hdrstop

#include 
#include 
#include 

int HEXASTRTODECIMAL( char * str , int len );
//---------------------------------------------------------------------------
#pragma argsused
int main(int argc, char* argv[])
{
    char data[100];
    memset( data , 0x00 , sizeof( data ));

    scanf(  "%s" , data );

    printf( "INPUT  Hexa Str : %s\n" , data );
    printf( "Output Decimal  : %ld\n" , HEXASTRTODECIMAL( data , strlen( data )));

    getch();
    return 0;
}
//---------------------------------------------------------------------------
int HEXASTRTODECIMAL( char * str , int len )
{
    int key_map[255]; // 이거 전역
    int rt   = 0;
    int calc = 0;

    memset( key_map , -1 , sizeof( key_map )); // 이거

    for( int i = '0' , j = 0  ; i <= '9' ; i++ , j++ ) key_map[i] = j;  // 이거 
    for( int i = 'a' , j = 10 ; i <= 'f' ; i++ , j++ ) key_map[i] = j;  // 이거
    for( int i = 'A' , j = 10 ; i <= 'F' ; i++ , j++ ) key_map[i] = j; // 이거 전역으로 빼면 한번만 실행해서 초기화 완료.
                                                                                         // 클레스에 메소드로 넣는다면 초기화 에서 해주면 될듯

    for( int i = len -1 , j = 0  ; i >= 0 ; i-- , j++)
    {
        calc = 1;
        for( int x = 0  ; x < j ; x++ )  calc*=16;
        rt += ( key_map[str[i]] * calc );
    }
    return rt;
}
 

테스트 결과
64
INPUT  Hexa Str : 64
Output Decimal  : 100
ffff
INPUT  Hexa Str : ffff
Output Decimal  : 65535
FFFF
INPUT  Hexa Str : FFFF
Output Decimal  : 65535
FF
INPUT  Hexa Str : FF
Output Decimal  : 255

나름은 제대로 나오는거 같네요..
즐플하십시요~~!

PS : </conio.h></stdlib.h></stdio.h></vcl.h> 코드 에디터에서 이거 나오는 거는 위에 인크루드된 넘들이 테그로
       확인되서... "닫아야하는 군" 하고 친절하게 달아주는거 같군요.


땅주인 님이 쓰신 글 :
: 16진수 스트링을 decimal으로 변환하는 매크로를 작성했는데..
:
: 매크로 * 값 하면 에러 나고..
: 값 * 매크로 하면 에러가 나지 않네요.. 매크로를 수식 중간에 쓸 수 없다.. 뭐 이런 얘기는 못 들은 것 같은데..
:
:
: #define HEXTODECIMAL(x)	    (( x == "0") ?  0 :      \
: 							(( x == "1") ?  1 :      \
: 							(( x == "2") ?  2 :      \
: 							(( x == "3") ?  3 :      \
: 							(( x == "4") ?  4 :      \
: 							(( x == "5") ?  5 :      \
: 							(( x == "6") ?  6 :      \
: 							(( x == "7") ?  7 :      \
: 							(( x == "8") ?  8 :      \
: 							(( x == "9") ?  9 :      \
: 							(( x == "A") ? 10 :      \
: 							(( x == "B") ? 11 :      \
: 							(( x == "C") ? 12 :      \
: 							(( x == "D") ? 13 :      \
: 							(( x == "E") ? 14 :      \
: 							(( x == "F") ? 15 : 0 ))))))))))))))));
: ....
: 	UnicodeString HexStr = "A5";
: 	int i,j,k;
: 	UnicodeString a,b;
: 	a = HexStr.SubString(1,1).UpperCase();
: 	b = HexStr.SubString(2,1).UpperCase();
: 
: 	i = HEXTODECIMAL(a) * 16;    // Error~! but =>  i = 16 * HEXTODECIMAL(a); => Ok~!
: 	j = HEXTODECIMAL(b);
: 
: 	k = i + j;
: 

:
: [BCC32 Error] Unit2.cpp(48): E2062 Invalid indirection
:
: 코스 상 좀 깔끔하지 않은 것 같아서.. 왜 이런 것이지요?
: 그리고, Hex String을 값으로 바꾸는 깔끔한 방법은?
:
: 감사합니다.

+ -

관련 글 리스트
60379 [질문] 이상한 매크로 동작... ? (HexToDecimal 변환 시..) 땅주인 1138 2010/03/04
60383     Re:[질문] 이상한 매크로 동작... ? (HexToDecimal 변환 시..) 제리압빠. 1266 2010/03/04
60384         음.. 위에거 자리수가 좀 작아보여서..__int64를 써 봤습니다.. 제리압빠. 1411 2010/03/04
60381     Re:[질문] 이상한 매크로 동작... ? (HexToDecimal 변환 시..) 장성호 1227 2010/03/04
60380     Re:[질문] 이상한 매크로 동작... ? (HexToDecimal 변환 시..) Lyn 1130 2010/03/04
60382         Re:Re:[질문] 이상한 매크로 동작... ? (HexToDecimal 변환 시..) 땅주인 1479 2010/03/04
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.