2013-04-26 6 views
3

Так что у меня возникли проблемы с использованием qsort для сортировки массива структур.массив структуры qsort удаляет все

Я использовал эту ссылку в качестве примера: http://support.microsoft.com/kb/73853

При запуске программы она дает мне гасит для имен, которые были первоначально в структуре и нулей для всех значений gp.

typedef int (*compfn)(const void*, const void*); 

struct record 
{ 
    char player[20]; 
    int gp; 
}; 
struct record entries[15]; 

int compare(struct record *, struct record *); 


void show()   
{ 
    int v; 
    qsort((void *)entries, 10, sizeof(struct record), (compfunc)compare); 
    struct record *p = entries; 
    for(v=0;v<counter;v++, p++) 
    { 
     printf("%s ..... %d \n", p->player , p->gp); 
    } 
} 

int compare(struct record * p1, struct record * p2) 
{ 
    if(p1->gp < p2->gp) 
     return -1; 
    else if (p1->gp > p2->gp) 
     return 1; 
    else 
     return 0; 
} 

Edit: Привет всем спасибо за вашу помощь, но я попробовал все, что вы, ребята сказали, и он до сих пор просто переворачивает все значения до нуля

+0

это не должно компилироваться. –

+1

Помимо (compfunc) to (compfn) его работы для меня – 999k

ответ

0

Помимо того, что майкрософт страницы поддержки это настоящий беспорядок, и не является хорошим источником для изучения C, ваш код отсутствует в & здесь:

... 
qsort((void *)entries, 10, sizeof(struct record), (compfunc)compare); 
... 

должен быть

... 
qsort((void *)&entries, 10, sizeof(struct record), (compfunc)compare); 
... 

также, я думаю, что вы имели в виду, чтобы написать

... 
qsort((void *)&entries, 15, sizeof(struct record), (compfn)compare); 
... 
+0

Имена массивов неявно преобразуются в указатели при использовании в выражении. –

+0

@luserdroog Я знаю. Я просто хотел максимально приблизиться к коду, предоставленному страницей поддержки microsoft, и OP. –

+0

О, я вижу. Я не потрудился посмотреть на эту страницу. Интересно, почему они не писали '(void *) (struct record *) & entries [0]': намного яснее. :) –

2

Ваш звонок может быть упрощена, нет необходимости подавать в void *:

qsort(entries, 10, sizeof entries[0], compare); 

Примечание использование sizeof entries[0] чтобы избежать бессмысленного повторения массива тип.

Там не должно быть приведение функции сравнения либо, так как он просто должен быть определен в соответствии с прототипом:

static int compare(const void *a, const void *b) 
{ 
    const struct record *ra = a, *rb = b; 

    if(ra->gp < rb->gp) 
    return -1; 
    if (ra->gp > rb->gp) 
    return 1; 
    return 0; 
} 

Кстати, просто быть информативными, вот классический способ (?) tersify 3-полосная тестирование в том, что вы иногда видите в таких местах, как это:

return (ra->gp < rb->gp) ? -1 : (ra->gp > rb->gp); 

не спорю для это способ выразить это, особенно если вы не новичок, но думал, я бы включить поскольку nd может быть учебным для просмотра.

+0

«Классический» способ, который я видел, это «return (ra-> gp> rb-> gp) - (ra-> gp < rb-> gp); ' – caf

+1

« Классический »способ, который я видел, - это« return (ra-> gp - rb-> gp) », но я не знаю, требует ли Windows qsort, чтобы результаты функции сравнения находились в {- 1, 0, 1}, linux qsort нет. –