qsort compare problem
-
Hallo.
Wie ich gesehen habe, ist das Thema qsort und compare hier schon häufig behandelt
worden. Leider hat mir das noch nicht weiter geholfen. Deshalb jetzt meine Frage.Ich möchte mit qsort ein Array von Strukturen sortieren.
qsort(leute, arrayLength, sizeof(struct Person),cmpto);
qsort ist soweit auch klar.
Nur habe ich ein problem, die structur an die cmpto funktion zu übergeben. cmpto erwartet jaconst void* p
das! Nun habe ich in einem Beitrag hier gesehen, dass man halt das Ganze mit einem cast in eine structur umwandeln könnte, um dann mit der structur was zu machen. Leider klappt das mit dem cast nich.
Hat jemand eine Idee, wie ich das machen kann?
Freue mich jetzt schon. Keno
-
zeig mal deinen code. kann ja nicht so viel sein...
-
#include <stdio.h> #include <stdlib.h> #include <string.h> int cmpto(const void *ptr1, const void *ptr2); struct Person {int id; char Vorname[20]; char Nachname[20];}; struct Person leute[3]= {{12,"Brad","Pitt"}, {13,"Bill","Gates"}, {24,"Cash","Johnny"}, }; /* Vergleichsfunktion */ int cmpto(const void* p1, const void* p2 ) { // hier will ich casten oder wie auch immer!! } int main() { int i; int arrayLength = sizeof(leute)/sizeof(Person); qsort(leute, arrayLength, sizeof(struct Person),cmpto); return EXIT_SUCCESS; }
-
Ist doch einfach (
):
int cmpto(const void* p1, const void* p2 ) { const struct Person *person1 = (const struct Person *)p1; const struct Person *person2 = (const struct Person *)p2; return strcmp(person1->Nachname, person2->Nachname); }
Wobei ich dir noch zu einem "typedef struct Person Person;" rate, dann brauchst du nicht immer "struct" voranstellen.
-
Ich würde von rekursiven Präprozessordirektiven abraten. Ich würde sagen *typedef struct Person PERSON, PT_PERSON;.
-
Hä, Präprozessordirektiven ???
"typedef" ist ein ganz normales C Schlüsselwort.
-
Danke schön. So gehts.
-
typedef struct Person Person;
ist zwar weder ne Präprozessordirektive noch rekursiv
sieht aber dennoch komisch aus (wußte bisher gar nicht, dass das so geht.Ich schreibe struct-Deklarationen immer groß und dann
struct DINGENS { ... }; typedef struct DINGENS Dingens;
-
wobei GROSSCHRIFT eigentlich makros vorbehalten sein sollte.
ich mach's meistens so:typedef struct person { ... } person_t;
-
Hä, Präprozessordirektiven ???
"typedef" ist ein ganz normales C Schlüsselwort.Richtig. Aber umso schlimmer! Da versteckst du dann ganz real deine DAtentypen.
-
// ***** wwww.lernprogramme-technik.de *********
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//-----------------------------------------------------------------------------
struct Tiere { int Nummer;
char Name[15];
};struct Tiere Tier[10] ={
{ 2, "Affe" },
{ 5, "Elefant" },
{ 8, "Pferd" },
{ 4, "Aal" },
{ 10, "Hase" },
{ 8, "Llama" },
{ 1, "Hund" },
{ 6, "Katze" },
{ 3, "Zebra" },
{ 7, "Giraffe" } };
//---------------------------------------------------------------------------
int compare_Nummer(void const *Element1, void const *Element2)
{ return ((struct Tiere *)Element1)->Nummer -
((struct Tiere *)Element2)->Nummer;
}int compare_Namen(const void *Element1, const void *Element2)
{ return( strcmp((char*)((struct Tiere*) Element1)->Name,
(char*)(((struct Tiere*)Element2)->Name)));
}
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{ randomize();
Form1->Caption="Demo: qsort mit struct! www.lernprogramme-technik.de";
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Zeige_ButtonClick(TObject *Sender)
{ int n,l;
Zuffalszahlen_ListBox->Clear();
Sortiert_ListBox->Items->Clear();
{ for(n=0; n<=9; n++)
{ Zuffalszahlen_ListBox->Items->Add(IntToStr(Tier[n].Nummer)+
": " + Tier[n].Name);
}
}}
//---------------------------------------------------------------------------
void __fastcall TForm1::Sort_ButtonClick(TObject *Sender)
{ int n;
Sortiert_ListBox->Items->Clear();
qsort((void *)&Tier,10,sizeof(struct Tiere),compare_Nummer);
Sortiert_ListBox->Items->Add("Sortiert nach Nummer:");
for(n=0; n<=9; n++)
{ Sortiert_ListBox->Items->Add(IntToStr(Tier[n].Nummer)+
": " + Tier[n].Name);
}
qsort((void&Tier,10,sizeof(struct Tiere),compare_Namen);
Sortiert_ListBox->Items->Add("");
Sortiert_ListBox->Items->Add("Sortiert nach Name:");
for(n=0; n<=9; n++)
{ Sortiert_ListBox->Items->Add(IntToStr(Tier[n].Nummer)+
": " + Tier[n].Name);
}
}
//---------------------------------------------------------------------------