2013-11-14 3 views
1

main()에서 정의 된 정적 배열을 다른 함수에서 매개 변수로 함수에 제공하지 않고 사용할 수있는 방법은 무엇입니까? 예를 들어main()에서 배열을 사용하여

:

주() 정의한 배열 :

int Array[10]; 

정수 가득. 내가 qsort를위한 비교 함수를 작성하고 싶습니다, 즉,이 헤더 가지고 있습니다

int compar (const void* a, const void* b); 

와 나는이 같은 결정을 싶습니다 등

if Array[a]<Array[b] return 1 

...

이 배열을 qsort에 직접 지정할 수는 없지만 정확한 정렬에는 필요합니다.

또한이 배열은 정적 (다시 할당하지 않음)이어야합니다.

누구에게 아이디어가 있습니까?

답변

3

유일한 방법은 배열의 주소를 전역 변수로 사용할 수있게 만드는 것입니다.

배열 자체가 main() 안에 있더라도 가능하지만 범위를 올바르게 지정한 주소로 전역을 초기화하고 평생을 관찰해야합니다.

int *mains_array; 

static int qsort_callback(const void *a, const void *b) 
{ 
    /* use mains_array */ 
} 

int main(void) 
{ 
    int secret_array[100]; 

    mains_array = secret_array; 
    qsort(something, something, qsort_callback); 
} 

꽤 못생긴 해결책입니다. 더 많은 생각을해야합니다.

0

qsort에는 배열의 주소가 필요하므로 선택할 필요가 없습니다. 그러나 배열이 정의되는 곳은 중요하지 않습니다. 당신은 단지 그것을 참조 할 수 있어야합니다.

qsort 서명은 다음과 같습니다

void qsort(void *base, size_t nmemb, size_t size, 
       int (*compar)(const void *, const void *)); 

그래서 당신은에 의해 호출됩니다

qsort(Array, 10, sizeof(int), compar); 

그리고 당신은 평소와 같이 비교 기능을 할 수 있습니다 : 당신이 필요로하는

int compar (const void* a, const void* b) { 
    return *((int*)a) - *((int*)b); 
} 

compar에 전달 된 값이 색인이 아니라 주소 인 것을 이해해야합니다. 귀하의 배열의 세포. 따라서 compar 함수에서 Array을 사용할 필요가 없으며 이미 필요한 것을 얻을 수 있습니다.

1

다른 함수에서 로컬 변수에 액세스 할 수 없습니다. 전역 또는 파일 범위로 지정해야합니다.

글로벌 :

/* Declare Array outside any function */ 
int Array[10]; 

int main(... 

또는 파일 범위 :

/* Declare Array outside any function */ 
static int Array[10]; 

int main(... 

참고 :

귀하의 비교 기능은 요소에 비교하기 포인터를 받게됩니다.

내가 Array는 정렬 할 배열이 아니라고 믿고있어 있지만를 정렬하는 방법에 대한 정보가 포함 된 배열 : 당신은 당신이 당신의 비교 함수에서 포인터를 역 참조 할 필요가 int의 배열을 정렬하는 경우 정렬.

int compare (const void * ap, const void * bp) 
{ 
    int a = *((int*)ap); 
    int b = *((int*)bp); 

    if (Array[a] < Array[b]) { 
     return 1; 
    } 
    if (Array[a] > Array[b]) { 
     return -1; 
    } 
    return 0; 
} 
0

이미

qsort (a, numberOfElements, sizeOfEachElement, compare); 

를 호출하여 그에게 당신의 배열을 제공하고 당신이 당신의 비교 기능을 수행해야하는 것은 이것이다 : 내가 피할 싶어 정확히

int compare (const void * a, const void * b) 
{ 
    //Here int can be other type 
    return (*(int*)a - *(int*)b); 
} 
+0

이잖아. 이해, 나 그 항목의 가치에 의해 정렬 정렬해야하지 않습니다. 이 특정 배열은 다른 배열의 인덱스 만 포함하므로 정렬해야합니다. –

+0

그래서 두 개의 배열을 동시에 정렬하려고합니까? (예 : 하나는 정렬되고 다른 하나는 인덱스를 수정하여 변경된 것을 모방합니다) –