我正在制作一种C语言动态数组库,有点像。请注意,我是为了好玩才做的,所以请不要推荐现有的成百上千个库。
我开始实现排序。该数组具有任意元素大小,定义为结构体:
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;
我最初准备从排序函数开始:
/** 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
的比较函数签名如下:int (*compar)(const void*,const void*)
memcmp
的函数签名是:
int memcmp ( const void * ptr1, const void * ptr2, size_t type_size );
qsort
的回调函数中缺少元素大小,这意味着当传递NULL
作为回调时,我不能再拥有通用比较器函数。我可以手动生成多达X字节的比较器,但这听起来很丑陋。
我可以在使用memcpy
的同时使用qsort
(或其他内置排序功能)吗?还是我必须在内置比较器和内置排序函数之间进行选择?
qsort
函数中的元素大小不应该是你的数组的elm_size
吗? - Jongware