从不兼容的指针类型传递’qsort’的参数4

我在编写一个我们应该写的函数时遇到了一些麻烦。 据说,这是它应该如何工作,但它给了我不兼容的指针类型错误,我不知道如何解决它。

问题出在引用compare_last函数的qsort中。

#include  #include  #include  #define MAX_PERSONS 100 //person structure definition goes here typedef struct{ char last[32]; char first[32]; int year; }Person; //function declarations go here int compare_last(Person * ptr1, Person * ptr2); void main(void){//main function goes here char *infilename[20]; char *outfilename[20]; FILE * fptrin; FILE * fptrout; int i, j; Person musicians[MAX_PERSONS]; printf("Enter input file name: "); scanf("%s", infilename); printf("Enter output file name: "); scanf("%s", outfilename); strcat(*outfilename, ".htm"); fptrin = fopen(*infilename, "r"); fptrout = fopen(*outfilename, "w"); for(i = 0; i < MAX_PERSONS; i++) { fscanf(fptrin, "%s %s %i", musicians[i].last, musicians[i].first, &musicians[i].year); } qsort(musicians, i, sizeof(musicians[0]), compare_last); fprintf(fptrout, "\n\nLAB14\n"); for(j = 0; j < i; j++) { fprintf(fptrout, "%s %s %i 
", musicians[j].last, musicians[j].first, musicians[j].year); } fprintf(fptrout, "\n\n"); fclose(fptrin); fclose(fptrout); }//end main //function definitions go here int compare_last(Person * ptr1, Person * ptr2) { int result = strcmp(ptr1 -> last, ptr2 -> last); if(result != 0) return result; else return strcmp(ptr1 -> first, ptr2 -> first); }

 int compare_last(Person * ptr1, Person * ptr2); 

应该

 int compare_last(void * ptr1, void * ptr2); 

然后你需要在compare_last

qsort()的原型是:

 void qsort(void *base, size_t nmemb, size_t size, int(*compar)(const void *, const void *)); 

因此,您的排序函数需要匹配int(*compar)(const void *, const void *) ,或者在调用qsort()时需要强制转换。

如果要对Person*进行排序,最简单的方法是根据需要声明排序函数,然后在函数内部进行转换:

 static int compare_last(const void *ptr1, const void *ptr2) { const Person *p1 = ptr1, *p2 = ptr2; int result = strcmp(p1 -> last, p2 -> last); ... } 

因为const void *转换为const Person * ,所以根本不需要const void *转换。