Avatar billede Madsgadeberg Nybegynder
24. november 2012 - 11:54 Der er 5 kommentarer og
1 løsning

sortering af et array af structs med qsort() i c.

Hej experten.dk

Jeg har problemer med at sortere et array af structs med qsort.
arrayet match[] skal sorteres så de structs med største verdi i goals kommer først.

Med andre ord. Den kamp der har er blevet scoret flest mål i kommer først.


//Her har jeg min struct matchData som er global.
typedef struct matchData{
    int round, date, month, year, hour, seconds; char time[6], homeTeam[4], guestTeam[4]; int goalHome, goalGuest, spectators, goals;
}matchData;

// Arrayet match[] som skal sorteres (også globalt).
matchData match[MAXMATCHES];


// cmparefunktion til qsort().
88:int goalCompare(const void *ip1, const void *ip2){
89:    goals *t1 = (goals *) ip1, *t2 = (goals *) ip2;
90:
91:    if (strcmp(t1->goals, t2->goals) < 0){
92:        return -1;
93:    } else if (strcmp(t1->goals, t2->goals) > 0){
        return 1;
    } else
        return -int_compare(t1->population, t2->population);
}

// i opg 5 har jeg min qsort().
void opg5(){
    qsort(match, MAXMATCHES, sizeof(matchData), goalCompare);
}


Min compiler kommer med disse fejl:
$ gcc eksamensopgave.c
eksamensopgave.c: In function ‘goalCompare':
eksamensopgave.c:89:2: fejl: ‘goals' undeclared (first use in this function)
eksamensopgave.c:89:2: bemærk: each undeclared identifier is reported only once for each function it appears in
eksamensopgave.c:89:9: fejl: ‘t1' undeclared (first use in this function)
eksamensopgave.c:89:22: fejl: expected expression before ‘)' token
eksamensopgave.c:91:24: fejl: ‘t2' undeclared (first use in this function)

Hvorfor optræder goals som undeclared? kan simpelthen ikke se fejlen.
Skal lige siges jeg ikke har helvedet meget styr på qsort().
Dette er første gang jeg bruger den.
Avatar billede erikjacobsen Ekspert
24. november 2012 - 12:27 #1
Du har ingen type, der hedder goals, kun et felt i en struct. Mon ikke den linie skal være:

matchData *t1 = (matchData *) ip1, *t2 = (matchData *) ip2;

Inde i t1 og t2 findes nu et felt, der hedder goals, så fx t1->goals giver mening.
Avatar billede Madsgadeberg Nybegynder
24. november 2012 - 13:29 #2
hvis jeg ændrer det til dette:
int goalCompare(const void *ip1, const void *ip2){
    matchData *t1 = (matchData *) ip1;
    matchData *t2 = (matchData *) ip2;

    if (strcmp(t1->goals, t2->goals) < 0){
        return -1;
    } else if (strcmp(t1->goals, t2->goals) > 0){
        return 1;
    //} else
    //    return -int_compare(t1->population, t2->population);
}

Så skriver min compiler:
$ gcc eksamensopgave.c
eksamensopgave.c: In function ‘goalCompare':
eksamensopgave.c:92:2: advarsel: passing argument 1 of ‘strcmp' makes pointer from integer without a cast
/usr/include/string.h:30:6: bemærk: expected ‘const char *' but argument is of type ‘int'
eksamensopgave.c:92:2: advarsel: passing argument 2 of ‘strcmp' makes pointer from integer without a cast
/usr/include/string.h:30:6: bemærk: expected ‘const char *' but argument is of type ‘int'
eksamensopgave.c:94:2: advarsel: passing argument 1 of ‘strcmp' makes pointer from integer without a cast
/usr/include/string.h:30:6: bemærk: expected ‘const char *' but argument is of type ‘int'
eksamensopgave.c:94:2: advarsel: passing argument 2 of ‘strcmp' makes pointer from integer without a cast
/usr/include/string.h:30:6: bemærk: expected ‘const char *' but argument is of type ‘int'
eksamensopgave.c:101:12: fejl: expected expression before ‘char'
eksamensopgave.c:101:33: fejl: expected ‘;' before ‘{' token
eksamensopgave.c:376:1: fejl: expected declaration or statement at end of input
Avatar billede arne_v Ekspert
24. november 2012 - 13:49 #3
goals er int, saa proev:


int goalCompare(const void *ip1, const void *ip2)
{
    matchData *t1 = (matchData *) ip1;
    matchData *t2 = (matchData *) ip2;
    return t1->goals - t2->goals;
}
Avatar billede Madsgadeberg Nybegynder
24. november 2012 - 14:02 #4
Ja Arne! sådan!

Tænk jeg ikke havde tænkt på det.. Takker mange gange!

Smider du lige et svar?
Avatar billede arne_v Ekspert
24. november 2012 - 19:30 #5
OK

selvom jeg altsaa kun byggede oven paa Erik's svar
Avatar billede arne_v Ekspert
24. november 2012 - 19:31 #6
Hvis du faktisk bruger C++ og ikke C, saa er der en del ting i din kode som kunne goeres anderledes.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester