나는 C 동적 배열 라이브러리를 만들고있다. 참고 : 나는 자유 시간에을 재미있게 만들고 있기 때문에 기존의 수많은 도서관을 권장하지 마십시오.qsort와 함께 memcmp를 사용할 수 있습니까?
필자는 정렬 작업을 시작했습니다. I 원래 정렬 기능을 시작하기 위해 준비
typedef struct {
//[PRIVATE] Pointer to array data
void *array;
//[READONLY] How many elements are in array
size_t length;
//[PRIVATE] How many elements can further fit in array (allocated memory)
size_t size;
//[PRIVATE] Bytes per element
size_t elm_size;
} Array;
: 배열 구조체로 정의 된 임의의 요소의 크기이다 I 배운 그러나
/** sorts the array using provided comparator method
* if metod not provided, memcmp is used
* Comparator signature
* int my_comparator (const void * ptr1, const void * ptr2, size_t type_size);
**/
void array_sort(Array* a, int(*comparator)(const void*, const void*, size_t)) {
if(comparator == NULL)
comparator = &memcmp;
// Sorting algorithm should follow
}
약 qsort
:
void qsort (void* base, size_t num, size_t size, int (*compar)(const void*,const void*));
분명히 내 내부 배열을 qsort
으로 전달할 수 있습니다.
qsort (a->array, a->length, a->elm_size, comparator_callback);
을하지만 함정이있다 - qsort
의 비교기 서명으로 읽습니다 : memcmp
int (*compar)(const void*,const void*)
동안 '나는 그냥 부를 수의 서명은 다음과 같습니다
int memcmp (const void * ptr1, const void * ptr2, size_t type_size);
요소 크기 qsort
의 콜백에 누락되었습니다. 즉, NULL
이 콜백으로 전달되면 더 이상 일반 비교 함수를 사용할 수 없습니다. 필자는 수동으로 요소 크기의 X 바이트까지 비교기를 생성 할 수 있지만 추한 것처럼 들립니다.
(또는 다른 분류 내장형)을 memcpy
과 함께 사용할 수 있습니까? 아니면 내장형 비교기와 내장 정렬 기능 중 하나를 선택해야합니까?
"기존 라이브러리를 100 만 건으로 권장하지 마십시오. *"웃었다. –
비교 함수에 전달 된 포인터는 Array 포인터가 될 것입니다. Array로 캐스팅 한 다음 해당 구조체의 length 멤버를 사용하여 비교할 바이트 수를 결정할 수 있습니다. – JJF
'qsort'의 요소 크기가 배열의'elm_size'가 아닌가요? – usr2564301