从不兼容的指针类型传递’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 *
转换。