2016-05-12 6 views
0

Ich habe einen Komparator-Funktion, die 1 zurückgibt, 0 oder -1, erklärt sich wie folgt:Aufruf qsort Komparator

int multiPrecisionCompare(const DIGIT_T a[], const DIGIT_T b[], int32_t length); 

wo DIGIT_T ist int8_t.

Ich möchte eine Funktion qsort aufrufen, aber ich habe ein Problem zu verstehen, was ich ändern oder wie die Komparatorfunktion im Inneren aufrufen muss.

qsort(bigArray->x, 8,30 , <-what here?????->); 


    i 

int multiprecisionCompare(const DIGIT_T a[], const DIGIT_T b[], int32t length) 
{ 
    while(length--) { // little endian 
if(a[length] > b[length]) 
    return 1; 
if(a[length] < b[length]) 
    return -1; 
} 

return 0; 
} 


point * bigArray = (point *)(malloc(K*sizeof(point))); 
CreateListAndOrder(lots of parameters) // this fills the bigArray unsorted 
/* point is a structure of X,Y,Z where each of this is DIGIT_T */ 
qsort((void *)bigArray, K, sizeof(point), cmp); 

ich mag es sortieren nach X-Koordinate, aber die durch int32t Länge gelöst wird, dass sie nur die erste Koordinate mit von diesen struct

int cmp(const void *a, const void *b){ 
    return multiPrecisionCompare((const DIGIT_T*)a, (const DIGIT_T*)b, DIGIT_LENGTH); 
    //return multiPrecisionCompare(*(const DIGIT_T**)a, *(const DIGIT_T**)b, DIGIT_LENGTH); 
} 
+0

'struct Daten {DIGIT_T * n; int32_t Länge; }; '..' int multiPrecisionCompare (const struct Daten * a, const struct Daten * b); 'oder' length 'übergeben, um die Funktion mit der globalen Variable zu vergleichen. – BLUEPIXY

+0

Gibt es in Ihrem Compiler-Unterstützung 'qsort_s (Basis, nmemb, Größe, compar, Kontext);'? – chux

+0

Zeigen Sie 'Punkt'. vielleicht 'Rückkehr multiPrecisionCompare (((Punkt *) a) -> x ((Punkt *) b) -> x, DIGIT_LENGTH);' – BLUEPIXY

Antwort

2

qsort nimmt einen Zeiger auf eine Funktion vergleichen, sollen die folgende Unterschrift:

Sie müssen Ihre Vergleichsfunktion anpassen, um diese Signatur anzupassen, und dann einfach einen Funktionszeiger übergeben. Hier

1

ist ein Beispiel:

int cmpfunc (const void * a, const void * b) 
{ 
    return (*(DIGIT_T *)a - *(DIGIT_T *)b); 
} 

qsort(bigArray->x, 8, 30 , cmpfunc); 
1
int multiPrecisionCompare(const DIGIT_T a[], const DIGIT_T b[], int32_t length); 
int32_t DIGIT_LENGTH; 
int cmp(const void *a, const void *b){ 
    return multiPrecisionCompare(((point*)a)->x, ((point*)b)->x, DIGIT_LENGTH); 
} 

DIGIT_LENGTH = length; 
point * bigArray = (point *)malloc(K*sizeof(point)); 
//fills the bigArray unsorted 
qsort(bigArray, K, sizeof(point), cmp); 
+0

Das sieht gut aus, aber aus irgendeinem Grund, wenn ich Debuggen Ich habe herausgefunden, dass in multiPrecisionCompare Funktion, dass der Wert genannt wird, ist, dass die Adresse der verglichen wird, Zeiger, nicht der Wert, bei dem der Zeiger zeigen wird, das sollte zu beheben sein, einfach, aber ich bin zu kämpfen, zu viel für heute ich denke,: D – user3411282

+0

@ user3411282 'qsort' in der Vergleichsfunktion einen Zeiger auf ein Element gibt. – BLUEPIXY

+0

Ich habe es so gemacht Sie es geschrieben, aber es funktioniert nicht, es war nicht das Sortieren und so ging ich Schritt für Schritt in Debug und ich habe es herausgefunden, nicht funktioniert, denn irgendwie in der letzten multiPrecisionCompare Funktion, die durch cmp-Funktion aufgerufen wird vergleicht den Wert von Zeigern, nicht die Werte der Objekte, auf die er zeigt :) – user3411282