2011-11-20 4 views
-1

동적으로 할당 된 2 차원 배열을 성공없이 qsort하려고합니다. 전역 배열 (예 : fileList [148096] [100])을 사용하면 문제가 없으므로 동적 할당과 관련이 있다고 가정합니다. 어떤 아이디어?동적으로 할당 된 2 차원 문자 배열을 할당하는 방법

// global: 
char **fileList; 

void allocateFileListArray(void) 
{ 
    int arraySize = 148096; 
    int fileNameLength = 100; 

    /* allocate storage for an array of pointers */ 
    fileList = (char **) malloc(arraySize * sizeof(char *)); 

    /* for each pointer, allocate storage for an array of chars */ 
    for (int i = 0; i < arraySize; i++) 
    { 
     if ((fileList[i] = (char *) malloc(fileNameLength * sizeof(char))) == NULL) 
      printf("failed fileList alloc\n"); 
    } 
} 

void sortTheArray(int fileListCount) 
{ 
    qsort ((char *) fileList, fileListCount, sizeof (*fileList), 
    (compfn) compareStrings); 
} 



int compareStrings(char *stackA, char *stackB) 
{ 
    int result; 

    result = strcmp(stackA->name, stackB->name); 

    return(result); 

} 
+0

2D 배열을 정렬하는 정의는 무엇입니까? 당신은 아마도 행을 정렬하고 싶습니다 ... 그 다음에 적절한 compare 함수를 전달하십시오 ... –

+0

'fileListIndex'를 선언하지 않았습니다. 그냥 짐작 하긴하지만, 고정 크기 배열 유형에는 맞지만 동적으로 할당 된 배열에는 맞지 않는'(sizeof (fileList)/sizeof (* fileList)) '로 계산하고 있습니다. –

+0

정확히 무엇이 문제입니까? BTW compareStrings()에 대한 정의를 추가하십시오. 또한 : 단편에있는 캐스트 중 어느 것도 필요하지 않습니다. 그들을 버려. – wildplasser

답변

1

char filelist [4095] [110] 예는 allocateFileListArray에서의 할당과 같지 않습니다. 포인터의 배열은 배열의 배열과 다릅니다. 당신은

int compareStrings(const void *stackA, const void *stackB) 
{ 
    const char *a=*(const char**)stackA; 
    const char *b=*(const char**)stackB; 
    return strcmp(a,b); 
} 

처럼를 qsort의 비교 기능을 변경해야하며이를 qsort에 추한 캐스트없이이 기능을 사용할 수 있습니다.

+0

그럴 수 있습니다. 옆으로, compareStrings()에 대한 인수가 "const"일 필요가있는 이유는 무엇입니까? – PaeneInsula

+0

qsort의 callback-compare 함수에 대한 프로토 타입을 참조하십시오. const 한정자를 무시해서는 안됩니다. – user411313

0

방법에 대해 :

void sortTheArray(void) 
{ 
    qsort (fileList, arraySize, sizeof(char *), (compfn) compareStrings); 
} 

?

qsort의 정의를보고 이에 따라 매개 변수를 전달하십시오.

그래도 작동하지 않으면 compareStrings()를 살펴보십시오. 간접 지정의 수준이 너무 높거나 낮습니까? compareStrings()에 대한 정보가 없기 때문에 compareStrings()와 관련이 있다면 말할 수 없습니다.

0

2D 할당 된 int 배열에서도 비슷한 문제가있었습니다. 그것은 malloced 공간에 대한 포인터의 배열입니다. 몇 가지 복잡한 요소가있다 : 비교 기능에

1) 포인터 주조, @ user411313 언급 한 바와 같이 당신이 역 참조 값의 두 배가

2) 통과 크기를 얻을 수 있어야하므로,이 포인터에 대한 포인터입니다 qsort. 크기는 포인터의 크기이며 2D 배열의 열 개수는 아닙니다 (var [row] [col]의 경우와 마찬가지로).

관련 문제