기능

2011-05-06 3 views
0

내 프로그램에 문자열의 배열을 전달하는 것은기능

char TYPEDATA_XML_FN[ARRLEN][SIZEALCO]; 
char TYPEDATA_MD5_FN[ARRLEN][SIZEALCO]; 
char identifier[ARRLEN][MAX_STRING_LENGTH]; 
char Temppath[SIZEALCO]; 
int arraynum; 

// ... 

arraynum = 0; 
for(arraynum = 0; arraynum <ARRLEN; arraynum++) 
{ 
    /* Create the file name with the path*/ 
    strcpy(Temppath,"/fw/TYPEDATA/"); 
    nameFil(Temppath,identifier[arraynum],TYPEDATA_XML_FN[arraynum],TYPEDATA_MD5_FN[arraynum]); 
} 

하위 기능이며, 주요 기능에

#define ARRLEN 10 
#define SIZEALCO 128 
#define MAX_STRING_LENGTH 12 

입니다.

void pase(char b[ARRLEN][MAX_STRING_LENGTH]) 
{ 
    // ... 
} 

가 지금과 같이 경고 메시지를 받았습니다 "경고 : 통과 호환되지 않는 포인터 유형에서`PASE '의 인수 1"나는 (재판)

char** a = calloc(ARRLEN, sizeof(char *)); 
for(i = 0; i < ARRLEN ; ++i) 
a[i] = ucmalloc(MAX_STRING_LENGTH); 
pase(a); 

하위 기능을 사용했다.

사실, 전체 문자열 배열 식별자 TYPEDATA_XML_FN, TYPEDATA_MD5_FN을 전달하고 싶습니다. 이제 단일 문자열을 하위 함수로 전달하고 있습니다. 친절하게 안내 해줍니다. 당신

답변

0

감사 프로토 타입 void pase(char b[ARRLEN][MAX_STRING_LENGTH]) 그렇지 않으면 확인 경계의 의미 (첫 번째 배열 차원이 무시됩니다)이 있기 때문에

void pase(char b[][MAX_STRING_LENGTH]) 

이 더 나은 것, 오히려 잘못 선도하고 있습니다.

"호환되지 않는 포인터 유형"을 얻는 이유는 a이 포인터의 배열이기 때문입니다. a이 증가하면 (포인터 자체로) 포인터의 크기만큼 주소가 증가합니다. 그러나 bMAX_STRING_LENGTH 크기의 배열이므로 b이 증가하면 값이 MAX_STRING_LENGTH만큼 증가합니다.

배열을 할당 한 방법은 a입니다. 여기에 필요한 연속 메모리가 제공되지는 않습니다. 포인터의 배열을 사용하여 원하는 것을 얻을 수 있지만, 실제로 원하는 것을 결정해야합니다. 당신은 [] [] 표기법을 사용하고자하는 경우에 당신은 당신이 때문에 한 차원 배열 있지만 혼란스러워지고있다

calloc(MAX_STRING_LENGTH,ARRLEN); 
0

에 필요 char[][N]이로 전환되지인 2 차원 포인터 char * 같은 char[] 동작합니다, char ** 실제로는 (*char)[N] (char의 길이가 n 인 배열에 대한 포인터)과 비슷합니다. 포인터에

  1. 를 사용하여 포인터 : 당신은 2 개 차원 배열을 수신하는 기능을하려면

    그래서, 당신은 두 가지 선택이

    void f(char ** array, int nrows, int ncols); 
    

    는 문자를 만들 **하기를, 포인터를위한 배열을 만들고 각각에 대해 malloc을 호출하십시오.

  2. 를 사용하여 두 개의 차원 배열 :

    void f(char array[][NCOLS], int nrows); 
    //note: NCOLS is a compile time constant now 
    //NROWS is the first dimension and can be omited from array[NROWS][NCOLS] 
    

    까다로운 비트는 2 개 차원 배열을-malloc을 보내고있다 :

    char (*my_array)[NCOLS]; 
    //my_identifiers is a pointer to arrays of length NCOLS 
    // it can be passed to any function expecting a car[][NCOLS] 
    
    my_array = malloc(number_of_rows*(sizeof *my_array)); 
    

당신은 또한 쉽게 이해할 수 있도록 할 수 있습니다 이 모든 것을 typedef의 좋은 선택과 함께 :

typedef char MY_STRING[MAX_STR_LENGTH]; 
//define my strings as arrays of MAX_STRING_LENGTH 

void f(MY_STRING array[]); 

...  

MY_STRING *arr = malloc(nstrings*sizeof(MY_STRING)); 
f(arr);