iT邦幫忙

1

qsort()忽然不能用了

  • 分享至 

  • xImage
#include<stdio.h>
#include<stdlib.h>
int compare_item(int *item1,int *item2)
{
    if(*item1 > *item2)
    {
        return -1;
    }
    else if(*item1 < *item2)
    {
        return 1;
    }
    else
    {
        return 0;
    }
}
main()
{
    int arr[5] = {5,4,3,2,1};
    qsort(arr,5,sizeof(arr),compare_item);
    for(int i = 0 ; i < 5 ; i++)
    {
        printf("%d ",arr[i]);
    }
}

原本只要include<stdlib.h>就可以透過qsort()進行排序,但今天安裝了GCC之後,就忽然不能用了,編譯時都會出現:
1.c:137:29: warning: incompatible function pointer types passing 'int (int, int)' to parameter of type 'int (* _Nonnull)(const void *, const void )' [-Wincompatible-function-pointer-types]
qsort(arr,5,sizeof(arr),compare_item);
^~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/stdlib.h:161:22: note: passing argument to parameter '__compar' here
int (
_Nonnull __compar)(const void *, const void *));
請問是不是在安裝東西時更動到了什麼呢?

不過我還有一個疑點,我是用mac,mac用gcc編譯好像都是直接用clang編譯,那麼我從brew下載安裝GCC應該無妨吧,畢竟編譯都是用clang。

請問有沒有人有經驗,請教一下該怎麼解決?

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

2
海綿寶寶
iT邦大神 1 級 ‧ 2021-05-29 12:04:39
最佳解答

參考這篇修改程式如下:

#include<stdio.h>
#include<stdlib.h>

int compare( const void *arg1, const void *arg2 )
{
	int ret = *(int*)(arg1)-*(int*)(arg2);
    if (ret>0) return 1;
    if (ret<0) return -1;
    return 0;
}
int main()
{
    int arr[5] = {5,4,3,2,1};
    qsort(arr,5,sizeof(int),compare);
    for(int i = 0 ; i < 5 ; i++) {
        printf("%d ",arr[i]);
    }
}
vuj8104 iT邦新手 4 級 ‧ 2021-05-29 13:25:15 檢舉

請問為何把傳入的參數型態改成const void就可以了?是

而且我原本傳入的參數型態不使用const void是可以的,還是說這是編譯器的問題?

訊息寫的是
incompatible function pointer types passing 'int (int, int)' to parameter of type 'int (* _Nonnull)(const void *, const void )
就是你把 int(int, int) 傳進 int(const void *, const void)
所以我就改了這部份
至於「為什麼原本可以現在不行,是否是編譯器的問題」
...我不知道

vuj8104 iT邦新手 4 級 ‧ 2021-05-29 20:32:38 檢舉

雖然不知道為何突然不能像以前那樣用,但至少修改後可以正常運作了,謝謝您

我要發表回答

立即登入回答