본문 바로가기

쓰기

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/149/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 [필독] 테스트필터 사용시 주의사항 라파에 2008-08-03 155437
183 Talk cmd로 리버ex 테스트 [2] file 앙마vv 2008-07-25 8011
182 Talk RLCmd, KoFilter 의 디버그 로그 기능에 대해.. whoami 2008-07-26 9246
181 Talk ATCode 버전업에 대해 - 관리자님 봐주세요.. [1] whoami 2008-07-26 9241
180 Talk SOW 방식 지원 ATCode 플러그인 소스 커밋하였습니다.. [2] whoami 2008-07-27 8829
179 Talk RLCmd, KoFilter 의 디버그 로그 기능에 대해 - 2 whoami 2008-07-28 10308
178 Talk 사용자 사전 플러그인에 대해서 설문 [5] Hide_D 2008-07-30 8785
177 Talk 쓸모가 있을것 같은 기능들 [4] Hide_D 2008-07-30 18225
176 Talk 전에 쓸모 있는 기능의 2번 관련 Hide_D 2008-07-31 8860
175 Talk 리얼라이브 세이브에 대해서... [4] 나는누구인감? 2008-08-01 7894
174 Talk DumpText를 만들고 있는데... [2] Hide_D 2008-08-02 7892
173 Talk 퓩퓩... 퓩퓩... oTL whoami 2008-08-02 7557
» Talk 문자열 -> Hex 변환이 제대로 안되네요. [7] Hide_D 2008-08-02 7561
171 Talk DumpText는 아직 개선이 좀 필요한듯; [3] Hide_D 2008-08-03 8111
170 Talk 0.3에서 추가할것 Hide_D 2008-08-03 7908
169 Talk VS 2005로 갈아탔습니다 [1] Hide_D 2008-08-03 8272
168 Talk 현재까지 작업물 + 에러 OTL [2] file Hide_D 2008-08-03 9891
167 Talk 함수, 변수 작명법 잘 정리된곳 없나요; [1] Hide_D 2008-08-03 9291
166 Talk 플러그인을 다시 Multi2용으로 만들면서 생긴 궁금증 [4] Hide_D 2008-08-09 8374
165 Talk 맵을 이렇게 사용해도 되나요? [2] Hide_D 2008-08-09 8705