'포인터'에 해당되는 글 2건

  1. 2011.05.27 포인터 연습 (6)
  2. 2009.06.22 주의력 부족 (2)

포인터 연습


요즘엔 쉘 스크립트만 붙잡고 노는지라, C는 안한지 몇달이 다되가네여.

포인터도 좀 마니 까먹은듯?

친구가 다중배열 넘기는 방법을 물어보길래 함 짜보네여,

옛날에도 2차원 배열, 2차원포인터로 넘기는건 기본이고 3차원 포인터(!) 까지 쓰고 그랬는데 요즘엔 영 기억이 안난다는

(이게다 스크립트 언어만 만지기 때문임 ㅠㅠ)

친구가 준 소스를 수정 ( 다 바꿨지만)해서 만든 완성본

자세한 설명은 생략, 뭐 어짜피 이블로그 오는사람은 이정도는 다 알겠져.
#include <stdio.h>

#define MAX_ROW 4
#define MAX_COL 5

int PArray_Type (int *array)
{
    int i;

    for(i = 0;i < MAX_COL;i ++){
        printf("%d\n", array[i]);
    }  
}

// 통채로 넘겼으므로, (보낸 배열과 같게)열의 크기를 정해줘야한다.
int PArray_Type2 (int (*array)[MAX_COL])
{
    int i,
        j; 

    for(i = 0;i < MAX_ROW;i ++){
        for(j = 0;j < MAX_COL;j ++){
            printf("%d\n", array[i][j]);
        }  
    }  
}

int main (int *argc, int argv[])
{
    int array[MAX_ROW][MAX_COL] = {{5,7,0,1,3},
                                   {8,2,3,7,0},
                                   {1,6,3,8,4},
                                   {1,2,4,8,3}},
        *array2,
        i; 

    for(i = 0;i < MAX_ROW;i ++){
        array2 = array[i]; // 각 row 의 맨앞 주소만 넘김
        PArray_Type(array2);
    }  

    puts("--");
    PArray_Type2(array);

    return 0;
}  

응용해서.. 다음과 같은것도 넘기는것도 가능합니다.

포인터 배열을 넘길때에는 받는 함수쪽에서 괄호를 주의하도록 합시다.
#include <stdlib.h>    
#include <stdio.h>    
#define FUNCTION_KEY_COUNT 12

char *keysym_function[FUNCTION_KEY_COUNT] = { "F1", "F2", "F3", "F4", "F5", "F6",   
                                                                             "F7", "F8", "F9", "F10", "F11", "F12"};   

void KeyArray_String(char (*array_keycode[FUNCTION_KEY_COUNT]))
{   
    int i;   
   
    for(i = 0;i < FUNCTION_KEY_COUNT;i ++){   
        printf("%s\n", array_keycode[i]);
    }   
}   

int main(int argc, char **argv)
{
    KeyArray_String(keysym_function);
}


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

포인터 연습  (6) 2011.05.27
간단한 디버그 함수  (0) 2010.08.16
오늘도 실수.. iconv  (0) 2010.06.24
아아 또 실수~!  (4) 2009.06.22
주의력 부족  (2) 2009.06.22
이진트리를 만들고나서....아 망했어요...  (2) 2009.05.25
Trackback 0 Comment 6
  1. Favicon of https://khmirage.tistory.com BlogIcon 환상경 2011.05.28 00:48 신고 address edit & del reply

    이게 대체 무슨소리인가요?
    아.....포인터를 안쓰는 파이썬을 너무 오래 봤나.... 하나도 모르겠네열;;;;;;
    역시 천재님!!

    • lowid 2011.05.30 01:42 address edit & del

      저도 쉘스크립트만 보고있다가 갑자기 C를 보려니깐
      좀 햇갈리더라고요~.. 뭐 다시보면 기억나겠죠

  2. Favicon of https://khmirage.tistory.com BlogIcon 환상경 2011.05.28 00:54 신고 address edit & del reply

    아.... 눈이 멀었나.... *array2, i; 선언이 왜 이렇게 되어있지? 하고 한참 쳐다봤었네요 -0-

    • lowid 2011.05.30 01:43 address edit & del

      하긴 저렇게 쓰는거보다 변수마다 타입을 적어두는 형태로도 코딩을 많이 하시더라구요
      근데 전 귀찮아서~ ㅋ

    • Favicon of https://khmirage.tistory.com BlogIcon 환상경 2011.05.31 23:07 신고 address edit & del

      ㅎㅎㅎ 예 제가 좀 독특한 코딩스타일을 사용해오다보니 -0-
      포인터변수 선언도 변수이름에 붙이는게 아니라 타입에 붙이는 방식을 선호했거든요 ~_~

      int *a; 가 아니라 int* a; 요런식으로요 ㅋㅋㅋ

    • Favicon of https://lowid.tistory.com BlogIcon Lowid 2011.06.07 00:10 신고 address edit & del

      사실 그렇게 쓰는게 더 알아보긴 쉽죠.
      근데 대부분 다른 코드에선 변수 바로 앞에 쓰는 경우가 많아서 저도 그냥 관습대로 쓰고 있습니다.

주의력 부족

아아. 전 역시

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

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

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

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

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

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

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

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

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

<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.06.22
이진트리를 만들고나서....아 망했어요...  (2) 2009.05.25
리눅스용 한글2008 체험판 크랙하기  (26) 2009.04.26
이거 왜이래~!  (6) 2009.04.02
Trackback 0 Comment 2
  1. Favicon of https://khmirage.tistory.com BlogIcon 환상경 2009.06.22 10:54 신고 address edit & del reply

    천재님의 삽질은 고급스러운 삽질이시네효;;;;

    • lowid 2009.06.22 13:35 address edit & del

      저보다 더 잘하시면서 괜히또 이러신다~ㅋ

prev 1 next