在 C 中使用 qsort 时发出警告

发布于 2024-08-27 13:24:52 字数 637 浏览 11 评论 0原文

我写了我的比较函数

int cmp(const int * a,const int * b)
 {
   if (*a==*b)
   return 0;
else
  if (*a < *b)
    return -1;
else
    return 1;
}

,我有我的声明

int cmp (const int * value1,const int * value2);

,我在我的程序中调用 qsort ,所以

qsort(currentCases,round,sizeof(int),cmp);

当我编译它时,我收到以下警告

warning: passing argument 4 of ‘qsort’ from incompatible pointer type
/usr/include/stdlib.h:710: note: expected ‘__compar_fn_t’ but argument is of type ‘int
(*)(const int *, const int *)’

该程序工作得很好,所以我唯一关心的是为什么它不喜欢我使用的方式那?

I wrote my comparison function

int cmp(const int * a,const int * b)
 {
   if (*a==*b)
   return 0;
else
  if (*a < *b)
    return -1;
else
    return 1;
}

and i have my declaration

int cmp (const int * value1,const int * value2);

and I'm calling qsort in my program like so

qsort(currentCases,round,sizeof(int),cmp);

when i compile it I get the following warning

warning: passing argument 4 of ‘qsort’ from incompatible pointer type
/usr/include/stdlib.h:710: note: expected ‘__compar_fn_t’ but argument is of type ‘int
(*)(const int *, const int *)’

The program works just fine so my only concern is why it doesn't like the way im using that?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

清浅ˋ旧时光 2024-09-03 13:24:52

cmp 函数的原型必须是

int cmp(const void* a, const void* b);

您可以在 qsort 调用中对其进行强制转换(不推荐):

qsort(currentCases, round, sizeof(int), (int(*)(const void*,const void*))cmp);

或者将 void 指针强制转换为 cmp 中的 int 指针(标准方法):

int cmp(const void* pa, const void* pb) {
   int a = *(const int*)pa;
   int b = *(const int*)pb;
   ...

The cmp function's prototype must be

int cmp(const void* a, const void* b);

You can either cast it in the invocation of qsort (not recommended):

qsort(currentCases, round, sizeof(int), (int(*)(const void*,const void*))cmp);

or casts the void-pointers to int-pointers in cmp (the standard approach):

int cmp(const void* pa, const void* pb) {
   int a = *(const int*)pa;
   int b = *(const int*)pb;
   ...
冬天的雪花 2024-09-03 13:24:52

根据手册页,__compar_fn_t 定义为: typedef int(*) __compar_fn_t (const void *, const void *)

你的 cmp指定 int* 参数。它不喜欢这样,但仅被列为警告。

According to the man page, a __compar_fn_t is defined as: typedef int(*) __compar_fn_t (const void *, const void *)

Your cmp specifies int* parameters. It doesn't like that, but is only listed as a warning.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文