'디버거'에 해당되는 글 1건

  1. 2009.06.22 주의력 부족 2

주의력 부족

아아. 전 역시

"여러개 있는거 중에서 다른거 찾기 같은거" 정말 못하는거 같습니다

특히 "물건찾기" 같은건 진짜 못합니다.

내가 어디두고 왔는지도 모르겠고, 찾지도 못하겠고...

몇일동안 애를 먹인게 있었습니다.

단어에다가 별표의 위치를 랜덤으로 찍는 그런 함수를 만들고 있었는데, 그렇게 하기 위해서는

랜덤한 숫자들을 가변배열에다가 저장할필요가 있어서 따로 메모리 할당을 받았더랍니다

그런데 이상하게 이게 프로그램이 돌다보면 갑자기 죽어버리는 현상이 생기는겁니다

위치도 딱 거기라고 찍을수가 없을정도로 가변적이였어요.

어쩃던 브레이크 포인터를 건 다음에 벅으를 잡으려고 삽질 ㅋ...

<ERROR>
    int *random_value,
        i,
        j,
        hidden_number_cnt    = -1,
        word_len            = -1;

    wchar_t *word_cp = (wchar_t*)0x0011;

    if((word_len = wcslen(word)) <= 0)
        return NULL;

    if((word_cp = wcsdup(word)) == NULL) // 쳐 죽는 위치 여기서 브레이크 포인터 증발 (합수종료)
        return NULL;                                   // 여기도 브포를 걸었지만 여기 안걸림, 즉 wcsdup에서 GG

    // 단어가 3이하일때 체크해줄것(무시한다던가) - 이함수 call한데서
    if(word_len < 4)
        hidden_number_cnt = 1;
        //return NULL;
    else if(word_len == 4 || word_len <= 5)
        hidden_number_cnt = 2;
    else if(word_len == 6 || word_len == 7)
        hidden_number_cnt = 3;
    else if(word_len >= 8 && word_len <= 10)
        hidden_number_cnt = 4;
    else if(word_len > 10)
        hidden_number_cnt = 5;  

    // windows에서는 가변배열 설정이 안되니 이렇게 하자
    if((random_value = (int*)calloc(hidden_number_cnt,sizeof(wchar_t))) == NULL)
        return NULL;

저기서 갑자기 주거 버리니깐 어어어 왜그런거얌. ㅜㅜ

이러고 위에 wcslen, wcsdup 함수 부분만 눈에 불을 켜고 찾아보았습니다

혹시해서 인자들 다 념어온거(리스트로 생성한) 틀렸나 확인을 해보았는데...... "다 맞 잖 아 !!!"

아 정말 저기서 저것만 미친듯이 보고보고보고보고 또 봐도 안되길래

미친듯이 여기 저기 주석을 쳐가면서 범위줄이기를 한결과

......
    for(i = 0;i < hidden_number_cnt ;i ++){
            //random_value[i] = rand() % word_len;   // 넌 꺼지고
            random_value[0] = rand() % word_len;     // 얘로 하니깐
......

아래 내용을 조금 바꾸니깐 잘되는겁니다!! (여기서 잘된다 == 안죽는다!)

그래서 오오오 여기가 "에 러 위 치 구 나 ㅋ" 했더니만...

또 아~무리 봐도 여기서 죽을 이유가 없어요 단지 i를 0으로 바꾼거 뿐이라니까?

hidden_number_cnt 변수가 이상한값 들어갔나 봐도 뭐 (당연히) 정상이고..

아놔 뭥미하다가 아까꺼 다시보니....

어?

<OK>
    // windows에서는 가변배열 설정이 안되니 이렇게 하자
    if((random_value = (int*)calloc(hidden_number_cnt,sizeof(int))) == NULL)
        return NULL;

우왕ㅋ wchar_t 라고 적어왔엉... int인데... int인데.. int인데...

저거 고치니깐 조난 잘돌아가네여 ㅜㅜ x 100

단 "한 단어" 차이인데 ㅜㅜ...

*오늘의 교훈*

1 디버거를 넘 믿지 말자.
- 특히 디버깅 위치에 너무 연연하지 말자 솔까말 저 디버깅 정보로 원래 문제가 된 부분을 절대 찾을수가 없엉ㅋ.

2 예측하지못한 에러(갑자기 사망!) 하는 경우는, 거의 100%에 가깝게,
잘못된 메모리 참조가 그 원인이다.

- 물론 (*) 참조 말고 전체적인 참조를 다 말하는거...(위에 경우에는 타입이 문제였죠)
그러고 보니 calloc에 강제로 타입케스팅을 해줬으니 컴파일러도 눈치 못챘겠네 ㅜㅜ

3 삽질엔 장사없다

교훈을 쓰자마자 동시에 난 자괴감에 빠짐.......

우어어어어엉? 저딴걸 내가 몇일씩 붙잡고 있었단 말이야?  이함수 60줄 정도 밖에 안

되는데 겨우 저걸로? 저걸로? 그럴리겅ㅄ엉ㄴ리ㅏㅁ나ㅣ루나ㅣㅇ라ㅣ

'Programming > C' 카테고리의 다른 글

오늘도 실수.. iconv  (0) 2010.06.24
아아 또 실수~!  (4) 2009.06.22
이진트리를 만들고나서....아 망했어요...  (2) 2009.05.25
리눅스용 한글2008 체험판 크랙하기  (26) 2009.04.26
이거 왜이래~!  (6) 2009.04.02
prev 1 next