2015-11-13 6 views
3

Это код, он сортирует данные крикетиров от avg работает. qsort функция показывает ошибку:qsort дает [Ошибка]: неверное преобразование из `int (*) (cricketer *, cricketer *) 'в` int (*) (const void *, const void *)'

[Error] C:\Users\Encoder\Documents\C-Free\Temp\Untitled3.cpp:29: error: invalid conversion from int (*)(cricketer*, cricketer*) to int (*)(const void*, const void*)

[Error] C:\Users\Encoder\Documents\C-Free\Temp\Untitled3.cpp:29: error: initializing argument 4 of `void qsort(void*, size_t, size_t, int ()(const void, const void*))'

включает

#include<stdlib.h> 
struct cricketer //structure for details of cricketer 
{ 
    int avg_run; 
    char name[20]; 
    int age; 
    int match_no; 
} c[4]; 
int sort(struct cricketer *a, struct cricketer *b); //pre-defining sort function 
int main()  //main function 
{ 
    int i, s; 
    for (i = 0; i < 3; i++) //enumerating structure records. 
    { 
     printf("enter the name of cricketer "); 
     fflush(stdin); 
     gets(c[i].name); 
     printf("enter his age,his no of matches and total average runs "); 
     scanf("%d%d%d",&c[i].age, &c[i].match_no, &c[i].avg_run); 
     } 
    printf("records before sorting"); 
    for (i = 0; i < 3; i++) 
    { 
     printf("\n\nname "); 
     puts(c[i].name); 
     printf("age %d\nno of matches %d\naverage runs %d\n",c[i].age, c[i].match_no, c[i].avg_run); 
    } 
    qsort(c, 3, sizeof(c[0]), sort); //sorting using qsort 
    printf("\nrecords after sorting"); 
    for (i = 0; i < 3; i++) 
    { 
     printf("\n\nname "); 
     puts(c[i].name); 
     printf("age %d\nno of matches %d\naverage runs %d\n",c[i].age, c[i].match_no, c[i].avg_run); 
    } 
} 
int sort(struct cricketer *a, struct cricketer *b) //sort function definition 
{ 
    if (a->avg_run == b->avg_run) 
     return 0; 
    else 
     if (a->avg_run > b->avg_run) 
      return 1; 
     else 
      return -1; 
} 

ответ

6

Функцию, чей указатель вы передаете qsort должен быть

int sort(const void* va, const void* vb); 

Потому что именно qsort ожидает. Тогда в рамках этой функции вы должны сделать в начале

const struct cricketer *a = (struct cricketer*) va; 
const struct cricketer *b = (struct cricketer*) vb; 

Или, если вы предпочитаете доступ с точками . вместо стрел ->

const struct cricketer a = *(struct cricketer*) va; 
const struct cricketer b = *(struct cricketer*) vb; 

Смотрите пример в этом reference

Что касается ошибки message, этот int (*)(cricketer*, cricketer*) является указателем на функцию, которая получает 2 указателя на cricketer в качестве аргументов. Компилятор ожидает такой указатель функции int (*)(const void, const void*), и он говорит вам, что он не может преобразовать первое в последнее. Также обратите внимание, как вам нужен указатель на данные const, поскольку сортировка не должна изменять данные.

+0

В идеале вы хотите сохранить классификатор 'const' для этих указателей. –

+0

@IanAbbott хорошая точка –