передача аргумента 4 из qsort из несовместимого типа указателя - PullRequest
3 голосов
/ 03 мая 2011

У меня возникли проблемы с функцией, которую мы должны писать.Предположительно, так оно и должно работать, но оно дает мне несовместимую ошибку типа указателя, и я не уверен, как ее исправить.

Проблема в qsort, ссылающемся на функцию Compare_last.

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

#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, "<html>\n<body>\n<title>LAB14</title>\n");

    for(j = 0; j < i; j++)
    {
        fprintf(fptrout, "%s %s %i <br>", musicians[j].last, musicians[j].first, musicians[j].year);
    }

    fprintf(fptrout, "</body>\n</html>\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); 
}

Ответы [ 2 ]

4 голосов
/ 03 мая 2011
int compare_last(Person * ptr1, Person * ptr2);

должно быть

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

Тогда вам нужно разыграть в compare_last

2 голосов
/ 03 мая 2011

Прототип для <a href="http://linux.die.net/man/3/qsort" rel="nofollow">qsort()</a>:

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 *.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...