#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。
請問有沒有人有經驗,請教一下該怎麼解決?
參考這篇修改程式如下:
#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]);
}
}
請問為何把傳入的參數型態改成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)
所以我就改了這部份
至於「為什麼原本可以現在不行,是否是編譯器的問題」
...我不知道
雖然不知道為何突然不能像以前那樣用,但至少修改後可以正常運作了,謝謝您