为qsort实现比较器。如何摆脱这种警告?

时间:2018-01-27 07:40:03

标签: c function-pointers qsort

我想知道如何摆脱以下警告:

   kwic1.c:118:48: warning: incompatible pointer types passing 'int (const char *,
  const char *)' to parameter of type 'int (* _Nonnull)(const void *, const
  void *)' [-Wincompatible-pointer-types]

我正在为qsort实现一个比较器。这是我的功能

 int comparator(const char *p, const char *q)
 {
   int index_p = 0;
   int index_q = 0;

    while(p[index_p] != '\0')
    {
      if(isupper(p[index_p]))
         break;
     index_p++;
    }
   ...

我尝试过投放pq,但它没有用。

2 个答案:

答案 0 :(得分:2)

在函数中使用(隐式)指针类型转换:

int comparator(const void *p1, const void *q1){
    const char *p = p1, *q = q1;
    // The rest of the code requires no change

函数原型在作为函数指针传递时完全匹配很重要。即,您不能将int (*)(const char*, const char*)函数指针传递给int (*)(const void*, const void*)参数。您应该做的就是将指针转换为比较函数中的所需类型。

答案 1 :(得分:-1)

Qsort在C中是一个真正的通用函数,但由于 类型很重要 ,它会引起人们的兴趣。

比较者的论据应该是(const void*)

如果您要排序int,那么您可以简单地转换为(const int*)
void替换为int。)

但看起来你正在排序(char*)。因此,您需要记住正确地施放额外的间接:(const void*)(const (char*)*)(const char**)
void替换为char*。)

我不确定你要用你提供的比较器片段来完成什么,但是 Here is an example of qsort()ing c-strings.