qsort vergleichsfunktion
-
ich habe hier folgende vergleichsfunktion:
int compare(const void *a, const void *b){
if(*(int **)a < (int **)b) return -1;
if((int **)a == (int **)b) return 0;
if((int **)a > *(int **)b) return 1;
}ich verstehe nicht warum es (int **) heißen muß.
warum nicht:int compare(const void *a, const void *b){
if(*(int *)a < *(int )b) return -1;
if((int *)a == *(int )b) return 0;
if((int *)a > *(int *)b) return 1;
}
-
Woher ist denn obiger Code? So allgemein kann man die Frage zwar nicht beantworten, weil die Vergleichsfunktion von der zu sortierenden Datenstruktur abhängt, aber die obere Funktion ist IMHO mit Sicherheit falsch, da dort Pointer verglichen werden.
[ Das wirkt sich spätestens dann aus, wenn das in Wirklichkeit int sind und mal ein negatives dabei ist, da Pointer auf unseren Intel-PCs als unsigned int behandelt werden. ]
-
hallo,
den code hab ich mir so zusammengefrickelt aus dem was ich so über die funktion gefunden habe.
es ist ein int array das sortiert werden soll. das dumme ist nur: es funktioniert.
wie muß die compare funktion denn dann aussehen, und viel wichtiger: warum?
-
Hab ich doch schon gesagt. Die erste Variante behandelt die Werte als Pointer, nicht als int. Versuch doch mal das Array { -1, 0, 1, 2, 3 } zu sortieren ... IMHO müßte damit { 0, 1, 2, 3, -1 } rauskommen, weil Pointer intern als unsigned behandelt werden.
-
danke, jetzt hab ich es verstanden.