본문 바로가기

쓰기

LPSTR ConvertHex(LPCSTR source){
    size_t Len=strlen(source);

    char Temp[2048]="";
    BYTE szBuf[3] = { '', };

    int j=0;

    for(size_t i=0;i<Len;i++){

        szBuf[0]=(BYTE) source[i];
        szBuf[1]=(BYTE) source[i+1];

        if(szBuf[0]<0x80){ //1바이트 코드라면
            j += sprintf(Temp+j,"%02X ",szBuf[0]);
        }
        else{ //2바이트라면
            j += sprintf(Temp+j,"%02X%02X ",szBuf[0],szBuf[1]);
            i++;
        }
    }
    LPSTR Temp2=Temp;
    return Temp2;
}

이렇게 완성을 했는데,
출력이 안됩니다.[...]
문제가 있는걸까요
분류 :
Talk
조회 수 :
7561
등록일 :
2008.08.02
20:09:43
엮인글 :
https://arallab.hided.net/3538/9be/trackback
게시글 주소 :
https://arallab.hided.net/board_devtalk/3538

whoami

2008.08.02
20:34:58

Hide_D군님은 변수의 범위랄까.. scope 라고 하는데.. 그것에 대한 개념이 잡히지 않으셨군요.

int *SomeFunc()
{  // 블럭 1
   int i = 3; // 변수 i 생성
   int *pi = &i;  // pi 는 i 를 가리키는 포인터. 예를 들어 i 가 1000번지에 있다고 하면 pi = 1000 (번지)

   {  // 블럭 2
      int j = 4;  // 변수 j 생성

      {  // 블럭 3
         int i = 5;  // 새로운 변수 i 생성. 이 단계에서 윗부분의 i 와 이 i 는 서로 다름.
        printf("i=%dn", i); // i = 5

      } // 블럭 3의 끝. 이걸 넘어가면서 두번째 i 는 사라짐. 곧 두번째 i 는 블럭 3에서만 통용되는 변수
      printf("i = %dn", i); // i = 3
   }  // 블럭 2의 끝. 이걸 넘어가면 j 는 사라짐.
  
   printf("j = %dn", j); // 에러. j 가 사라졌음.

   return pi;
} // 블럭 1의 끝. 여기서 첫번째 i 는 사라짐.

int main()
{
  int *pi;

  pi = SomeFunc(); // 여기서 pi = 1000 (번지).

  printf("i = %d", *pi); // 분명히 pi 는 1000번지의 i 를 가리키고 있었지만 SomeFunc() 가 끝나는 시점에 i 는 삭제.
  // 따라서 i = 3 이 나올 거라 생각했지만 실제로는 그렇게 나오지 않는다.
}

whoami

2008.08.02
20:39:32
따라서.. 위와 같이 하면 안되고요.

방법 1. static 혹은 전역변수를 사용하는 방법 (비추)
LPSTR ConvertHex(LPCSTR source){
    ....
    static char Temp[2048]=""; // static 변수
    return Temp;
}
혹은
char Temp[2048]; // 전역변수
LPSTR ConvertHex(LPCSTR source){
    ....
    return Temp;
}

방법 2. 버퍼를 부르는 측에서 같이 보내는 방법 (추천)
LPSTR ConvertHex(LPCSTR source, LPSTR Temp)
{
  ...
  return Temp;
}

int main()
{
   char Temp[2048];
   ....
   ConvertHex(source, Temp);
}

Hide_D

2008.08.02
20:41:16
감사합니다. 매번 이것때메 고생하네요

Hide_D

2008.08.02
20:48:12
LPSTR ConvertHex(LPCSTR source,LPSTR complete){
    size_t Len=strlen(source);

    char Temp[2048]="";
    BYTE szBuf[3] = { '', };

    int j=0;

    for(size_t i=0;i<Len;i++){
        szBuf[0]=(BYTE) source[i];
        szBuf[1]=(BYTE) source[i+1];
        if(szBuf[0]<0x80){ //1바이트 코드라면
            j += sprintf(Temp+j,"%02X ",szBuf[0]);
        }
        else{ //2바이트라면
            j += sprintf(Temp+j,"%02X%02X ",szBuf[0],szBuf[1]);
            i++;
        }
    }
    complete=Temp;
    return complete;
}

이렇게 바꿔도 안나오네요;

Hide_D

2008.08.02
20:51:48
... 그냥 complete=Temp를 주면
complete의 포인터가 Temp를 가리켜버리니까
의미가 없는행동이군요.

strcpy(complete,Temp);
return complete;
가 답이군요

whoami

2008.08.02
21:00:05

물론.. 이렇게 해도 됩니다; 단지 complete 가 이미 할당된 버퍼라는 것이 확실하면 일부러 Temp 라는 버퍼를 새로 할당해서 다시 복사할 필요는 특별히 없지요.

whoami

2008.08.02
20:56:49
그러니까..

LPSTR ConvertHex(LPCSTR source,LPSTR complete){

    char Temp[2048]=""; // Temp 변수 (2048개짜리 char 배열) 가 생성

    ... 중략 ...
  
    complete=Temp; // complete 는 Temp 라는 배열을 가리킴
    return complete;  // complete 라는 변수의 내용 (Temp배열이 *있던* 자리를 가리키고 있음) 만 넘겨줌
}  // 여기서 Temp 라는 배열 그 자체가 없어짐 = 중간에 했던 모든 Hex 변환 작업 자체가 사라진다는 뜻임.

고치려면..
LPSTR ConvertHex(LPCSTR source,LPSTR Temp){
    size_t Len=strlen(source);

    // char Temp[2048]=""; // 이걸 지웁니다.
    BYTE szBuf[3] = { '', };

    int j=0;

    for(size_t i=0;i<Len;i++){
        szBuf[0]=(BYTE) source[i];
        szBuf[1]=(BYTE) source[i+1];
        if(szBuf[0]<0x80){ //1바이트 코드라면
            j += sprintf(Temp+j,"%02X ",szBuf[0]);
        }
        else{ //2바이트라면
            j += sprintf(Temp+j,"%02X%02X ",szBuf[0],szBuf[1]);
            i++;
        }
    }
    return Temp;
}

void SomeFunc()
{
    // ... 생략 ...

    char complete[2048] = ""; // 여기서 버퍼의 실체를 생성
    ConvertHex(source, complete);
    // 이제 complete 내에 ConvertHex 내에 작업한 모든 데이타가 담겨있음.
}
List of Articles
번호 제목 글쓴이 조회 수sort 추천 수 날짜 최근 수정일
공지 Talk [필독] 테스트필터 사용시 주의사항 라파에 155441   2008-08-03 2008-12-16 00:03
203 Talk ATCustom - 함수 Reference [47] Hide_D 103937   2010-07-20 2010-08-28 04:59
AralTrans의 Algorithm Plugin ATCustom의 함수 목록입니다. - 문서 상태 - 기본 함수 : 변경 중 변경 확률 보통 고급 함수 : 변경 중 변경 확률 높음 - 기본 함수 목록 - 핵심적인 기능을 가지거나 내부의 C++ 코드를 사용해야만 하는 함수의 목록입니다. 메...  
202 Talk 아랄3 디버깅이 말이죠... [2] file JKLeetro 35689   2010-04-20 2010-10-20 07:18
 
201 Talk AT 0.2에서 내부 버퍼가 4096을 넘을 수 있어야 합니다. [1] Hide_D 34245   2010-07-13 2011-03-04 05:56
ATCode인지 뭔지 내부 버퍼 길이가 4096바이트로 제한되어있어서 그보다 큰 길이가 들어올 경우 문제가 생깁니다. 길이를 제한하는 플러그인들은 모두 대용량의 텍스트도 받아올 수 있도록 처리해야할 것 같습니다.  
200 Talk JSCustom의 초기 골격 코드를 SVN에 커밋했습니다. [1] Hide_D 33949   2010-09-18 2010-10-25 09:57
지금 안된 부분이.... 1. 고수준 함수, 고수준 보조 함수 구현 ( http://wiki.aralgood.com/index.php/JSCustom/FunctionReference ) 2. 아랄트랜스 0.3버전용 함수 구현 3. 아랄트랜스 플러그인 규격과 v8Wrapper 모듈의 연결 4. UI 정도네요. 올리긴 했지만 ...  
199 Talk ATCustom - 프로젝트 소개 [8] Hide_D 32701   2010-07-22 2011-07-14 11:21
- 소개 - ATCustom은 사용자가 직접 메모리 훅 및 메모리 작업을 할 수 있는 Script 기반 Algorithm 플러그인입니다. Google Chrome에 탑재된 v8 JavaScript Engine을 사용하여 JavaScript 파일을 파싱하여 동작하며, ATCustom에서 제공하는 API를 사용하여 작...  
198 Talk 0.3님 제발 자비좀[.....] file 아무개 31299   2010-05-23 2010-05-23 06:20
 
197 Talk 번역 모듈로 인터넷을 이용하는 방법. Hide_D 30170   2010-06-04 2010-06-04 23:54
굳이 번역기를 이지트랜스를 쓰지 않아도 아랄트랜스를 사용하는 방법이 필요합니다. 네이버 번역 등을 인터넷으로 접근해서 쓰는 방법으로 번역 모듈을 만들어 보겠습니다.  
196 Talk 0.3님 제발 자비좀[.....] [2] G2m 29951   2010-05-05 2010-05-23 06:21
디에스 이레 뚫으면서 알게된건데 일단 히데찌 말로는 관리자씨가 말하길 0.3 유니코드 완벽이염 ㅇㅇ 라고는 하는데 그 뭐랄까 문장 스크립트 형식이 00 30으로 시작하는 놈은 아랄이가 고대로 씹어 드셔서[............] 이걸 픽스로 잡아도 조트망이고 흠. ...  
195 Talk [0.2] OnPluginInit단에서 스레드를 만들 때 [회피법] Hide_D 27118   2010-06-23 2010-06-23 02:10
http://lab.aralgood.com/board_documents/3202 에 나온대로 플러그인이 초기화되는 시점이 '안전하지' 않기 때문에 Init 단에 스레드를 추가하기가 어려운데, 이를 위한 회피 방법입니다 [OnInitThread에 AfxBeginThread를 사용하면 '무조건' 얼어버리는 현상...  
194 Talk [질문] Http POST전송에 대한 이것저것 [3] 호기 24751   2009-09-22 2009-09-23 08:00
에고 Hide_D님과 HaruKaze님덕에 어찌어찌 POST전송을 할수 있게 되었네요 . 다시한번 두분께 너무 감사드리고요.. 전송해서 결과는 받는것은 되지만... 내용에 궁금한것이 두가지 있어서요 이렇게 다시 질문 올립니다. 우선 POST로 Header를 전송할때 말이에...  
193 Talk ATS의 문제점.. Hide_D 23578   2010-05-15 2010-05-15 19:18
0.2의 그 복잡하고 어려운 방식은 일단 뒤로 두고 0.3의 ATS가 갖는 허점이 1. 첨부파일, 필터 경로들을 [일일히!] 입력해야 한다. 2. 코드가 갱신되었을 때 대처할 방법이 전혀 없다. 일일히 입력하는 것 자체는 나쁘지 않은데, 2번 때문에 심각한 문제가 됩...  
192 Talk FixLine 버그 발생 [1] Hide_D 23382   2010-04-25 2010-05-01 22:19
!梨桜 01 21 979C 8DF7 을 처리하기 위해 %01%21{T} 로 설정하면 FixLine이 씹고 다음 데이터를 뱉지 않음 %21{T} 로 설정하면 아예 '닥치고 튕김' 지정된 문자열 + 임의의 문자열 구조로 했을때 버그가 있는듯 최대한 빨리 수리를 -_-;  
191 Talk '잡담인데' [2] FrigateBird 23212   2010-02-22 2011-06-28 01:25
0.3에서 일부 게임이 코드를 잠시 none 해야 되는 녀석들이 있잖아염 코드를 잠시 슬쩍 어디 처 올리든 해서 단축키로 전환하면 좋겠는데  
190 Talk [뻘글] 요새 프로텍터가 하도 무서워서 Hide_D 22878   2010-10-26 2010-10-26 00:15
대상 클라이언트에 최소한의 Injector만 '꽂아'두고 실제 동작은 '서버'에서 Injector와 IPC만으로 구동하는 형식은 어떨까 싶군요. Injector에서 '메모리' 입출력 관현 함수와 기본 WinAPI에 사용되는 DLL 로드(이건 위험하지 않으니까!)와 실제 WinAPI를 실...  
189 Talk 뭐라고 설명해야할까요 -_-; 하여간 설명 file G2m 22598   2010-01-21 2010-01-21 19:17
 
188 Talk KiriKiri 텍스트 파싱 개선 프로젝트! Hide_D 22403   2010-10-28 2010-10-28 00:21
필요가 생겨서[!] 이제 좀 개선을 시켜볼 생각입니다. 우선 문제가 되는 곳은 text=""겠군요  
187 Talk FixLine 테스트버전 081215 [1] file 그레이 20429   2008-12-16 2008-12-16 16:37
 
186 Talk Hide_D's Todo List [1] Hide_D 19791   2010-03-01 2012-08-03 09:02
좀 써 놔야 할것 같습니다 -_-; 안써두니까 안해요 1. FixLine v2 패턴간 빈칸을 없애는 옵션을 추가 -> 아마 큰 패턴 단위로 옵션을 추가할 수 있도록 하는게 좋을 것 같다. 처리 순서 변경 -> 선 개행, 선 패턴, 번역, 후 패턴, 후 개행을 선 패턴, 선 개행,...  
185 Talk 음음... 제가 도와드릴 일이 있을까요,,,? [2] S.sage 19488   2008-11-20 2009-01-06 01:10
뭐 별볼일 없는 고양이손이긴 하지만.;;;;;; 놀고있는 인원 여기하나 있으니 쓸려면 써주세요~..;;;