|
void qsort(void *base, size_t nelem, size_t width, int(*fcmp)(const void *, const void *);
//base : 정렬을 할 데이타가 있는 테이블의 선두 번지이다. 주로 배열에 데이터를 저장해두므로
배열명을 그대로사용한다.
//nelem : 정렬을 할 항목의 개수
//width : 정렬할 데이타의 크기
//fcmp : 정렬에 사용될 항목 비교 함수
마지막 인수는 함수 포인터로 되어 있네여..그러므로 함수명만 주면 당연히 찾아가겠지여..??
그리고 파라미터는 아마 함수내부에서 넘겨주는거 같네여..^^;
인자로 함수의 주소값만 넘어가고..
qsort함수 내부에서 fcmp함수에 파라미터를 넣겠져...^^;
모두 정렬할때까지 내부적으로 fcmp함수를 계속 호출하겠네여..
소스를 봐야지 정확히 알겠지만여..그럼 ..
또치 님이 쓰신 글 :
: 안녕하세요. 21일만에 끝낸다는 어떤 책을 거의 5개월 간 보고 있는 초보예요.
: 이제 거의 끝부분인데요, 궁금한 게 하나 있네요. 먼저 다음 코드를 좀 봐주시겠어요.
:
: /*................................ */
:
: 01 #include <stdio.h>
: 02 #include <stdlib.h>
:
: 03 #define MAX 20
:
: 04 int intcmp(const void *v1, const void *v2);
:
: 05 main()
: {
: int arr[MAX], count, key, *ptr;
:
: printf("Enter %d integer values; press Enter after each. \n", MAX);
:
: for(count=0;count<MAX;count++)
: scanf("%d", &arr[count]);
:
: puts("press Enter to sort the values.");
: getc(stdin);
:
: /*sorting */
:
: 14 qsort(arr, MAX, sizeof(arr[0]), intcmp);
:
: /* printing */
:
: for(count=0;count<MAX;count++)
: printf("\n arr[%d]=%d.", count, arr[count]);
:
: puts("\n Press Enter to continue.");
: getc(stdin);
:
: /*input searching key */
:
: printf("Enter a value to search for : ");
: scanf("%d", &key);
:
: /* executing */
:
: ptr=(int *)bsearch(&key,arr, MAX, sizeof(arr[0]), intcmp);
:
: if(ptr !=NULL)
: printf("%d found at arr[%d].", key, (ptr-arr));
: else
: printf("%d not found.", key);
:
: return(0);
: }
:
: 31 int intcmp(const void *v1, const void *v2)
: 32 {
:
: 33 return(*(int *)v1 - *(int *)v2);
:
: 34 }
:
: /* ---------------------------------------------- */
:
: 질문은 두 가지인데요, 첫번째는 14줄에 있는 qsort()에서 intcmp에 관한 겁니다. 제가 알기로는
: 이게 비교함수에 대한 포인터인데요, 이게 마지막에 있는 함수를 가르키기 위해서는
: 어떤 작업이 필요한 게 아닌가요? 보통 포인터를 선언하고 이 포인터가 무엇을 가르키게
: 초기화하잖아요? 그런데 14줄의 intcmp는 그런 게 없어요. 그런데도 자동으로 31번째 줄에
: 정의되어 있는 함수를 찾을 수 있는 건가요, 단지 이름이 같다는 이유로?
:
: 두번째는 31번째 함수 정의 부분에서 *v1과 *v2에 관한 것입니다. 궁금한 건 14번째 줄에서 어떤
: 인수도 전달하지 않았는데 이 두 값이 무슨 소용이 있고 함수 intcmp()는 무슨 작업을 할 수
: 있겠는가, 하는 것입니다. 그냥 이런 식으로 작성하면 알아서 하는 건가요?
:
: 우스운 질문이 될 수도 있겠지만 답변 좀 부탁드립니다. 전 몹시 궁금하거든요. ^^*
:
: 감사합니다.
:
:
:
:
|