2016-05-29 21 views
1

Ich habe eine dynamische Array-Hosts:SimGrid. Wie schreibe ich Komparator?

xbt_dynar_t dynar_host = xbt_dynar_new(sizeof(MSG_host_t), NULL); 

Jeder Host in Flops Informationen über seine Geschwindigkeit enthält. Ich möchte es nach der Geschwindigkeit ihres Hosts sortieren. In der Dokumentation habe ich die Funktion xbt_dynar_sort gefunden. Diese Funktion akzeptiert zwei Parameter: das dynamische Array selbst und den Komparator int_f_cpvoid_cpvoid_t compar_fn.

Irgendwelche Ratschläge oder Beispiel wie kann dieser Komparator geschrieben werden?

Antwort

3

Diese Funktion gilt nur die Standard-qsort Funktion der in den dynar gespeicherten Daten, so sollten Sie auch die libc documentation, die man page oder this tutorial für weitere Informationen lesen.

int mycmp(void *a,void*b) 
{ 
    MSG_host_t hostA = *(MSG_host_t*)a; 
    MSG_host_t hostB = *(MSG_host_t*)b; 
    double valA = MSG_host_get_speed(hostA); 
    double valB = MSG_host_get_speed(hostB) 
    return (valA > valB) - (valA < valB); 
} 

Und dann rufen xbt_dynar_sort(dynar, mycmp) sortieren Sie Ihre dynar:

So sollten Sie eine Funktion irgendwie ähnlich dem folgenden schreiben.

Beachten Sie, dass der tatsächliche Vergleich auf der Rückleitung der Funktion ein wenig kompliziert ist. Dies ist eine Möglichkeit, der Funktionssemantik (Rückgabe von -1 wenn A < B, 0 wenn A == B und 1 wenn A> B) in einer numerisch stabilen Weise zu folgen. Dies ist wie in der relevanten documentation of libc empfohlen.

+1

Vergleichen von Werten durch Subtraktion ist nie eine gute Idee. In diesem Fall könnte das Ergebnis inf, NaN, außerhalb des Bereichs oder ein Bruchwert sein, die alle in eine int-Ausbeute umgewandelt wurden, entweder ein ungültiges Ergebnis oder ein undefiniertes Verhalten. – 2501

+1

Ok, @ 2501. Ich habe meinen Code aktualisiert und einen kleinen Abschnitt hinzugefügt, der die komplexe resultierende Syntax erklärt. Danke fürs bemerken! –