我可以和memcmp一起使用qsort吗?

Tom*_*ica 6 c arrays memcpy qsort

我正在制作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;
Run Code Online (Sandbox Code Playgroud)

我最初准备这个以sort函数开始:

/** 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
}
Run Code Online (Sandbox Code Playgroud)

但是我了解到qsort:

void qsort (void* base, size_t num, size_t size, int (*compar)(const void*,const void*));
Run Code Online (Sandbox Code Playgroud)

显然,我可以将我的内部数组传递给qsort.我可以称之为:

qsort (a->array, a->length, a->elm_size, comparator_callback);
Run Code Online (Sandbox Code Playgroud)

但是有一个问题 - qsort比较器的签名读作:

int (*compar)(const void*,const void*)
Run Code Online (Sandbox Code Playgroud)

虽然memcmp签名是:

int memcmp ( const void * ptr1, const void * ptr2, size_t type_size );
Run Code Online (Sandbox Code Playgroud)

qsort回调中缺少元素大小,这意味着当NULL作为回调传递时,我不再具有通用比较器函数.我可以手动生成最多X字节元素大小的比较器,但听起来很难看.

我可以使用qsort(或其他内置排序)memcpy吗?或者我必须在内置比较器和内置排序功能之间进行选择?

Bry*_*hen 1

一种非线程安全的方法是使用私有全局变量来传递大小。

static size_t compareSize = 0;

int defaultComparator(const void *p1, const void *p2) {
  return memcmp(p1, p2, compareSize);
}

void array_sort(Array* a, int(*comparator)(const void*, const void*, size_t)) {
    if(comparator == NULL) {
      compareSize = a->elm_size;
      comparator = &defaultComparator;
    }
    // Sorting algorithm should follow
}
Run Code Online (Sandbox Code Playgroud)

compareSize您可以通过 make线程局部变量 ( __thread)使其成为线程安全的