【发布时间】:2017-04-12 19:54:31
【问题描述】:
我正在制作 C 动态数组库,有点。请注意,我这样做是为了好玩在我的空闲时间,所以请不要推荐数以百万计的现有库。
我开始实施排序。数组是任意元素大小,定义为struct:
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 字节元素大小的比较器,但这听起来很难看。
我可以将qsort(或其他内置排序)与memcpy 一起使用吗?还是我必须在内置比较器和内置排序功能之间进行选择?
【问题讨论】:
-
“所以请不要推荐现有的百万库。”我笑了
-
传递给比较函数的指针将是数组指针。您可以将它们转换为 Array,然后使用该结构的长度成员来确定要比较的字节数。
-
qsort中的元素大小不是意味着您的数组的elm_size吗? -
“但是有一个问题 - qsort 的比较器签名读取为:...”这是因为您将比较函数传递给最后一个参数,而不是数组。
-
@RadLexus 是的,当然......也许我不清楚我问的是什么。我的问题是我无法将该大小传递给 memcpy。默认的比较器函数需要知道什么是元素大小——正是因为它接收两个数组指针并且不知道它们的大小。