Generisches Vergleichen
Teil des Abschnitts Objektorientierte Programmierung der C-Journey von Coddy. Lektion 52 von 61.
Generische Funktionen wie qsort und bsearch in der Standardbibliothek von C benötigen eine Möglichkeit, Elemente zu vergleichen, ohne ihre Typen zu kennen. Die Lösung ist eine Vergleichsfunktion: eine von dir geschriebene Funktion, die der generische Algorithmus immer dann aufruft, wenn er zwei Elemente vergleichen muss.
Die Standardsignatur für Vergleichsfunktionen lautet:
int compare(const void* a, const void* b);Beide Parameter sind const void*, da die generische Funktion nicht weiß, welchen Typ du sortierst. Der Rückgabewert folgt einer bestimmten Konvention:
| Rückgabewert | Bedeutung |
|---|---|
| Negativ | a kommt vor b |
| Null | a ist gleich b |
| Positiv | a kommt nach b |
In deiner Vergleichsfunktion wandelst du die void*-Zeiger in den tatsächlichen Typ um und vergleichst die Werte. So vergleichst du Ganzzahlen:
int compare_ints(const void* a, const void* b) {
int val_a = *(const int*)a;
int val_b = *(const int*)b;
return val_a - val_b;
}Der Subtraktionstrick funktioniert gut für Ganzzahlen: Wenn a kleiner ist, ist das Ergebnis negativ; wenn es gleich ist, null; wenn es größer ist, positiv. Diese Funktion kann nun an qsort übergeben werden, um ein Ganzzahlen-Array in aufsteigender Reihenfolge zu sortieren.
Aufgabe
EinfachSchreibe eine Funktion compare_ints, die zwei Ganzzahlen gemäß der standardmäßigen Konvention für Vergleichsfunktionen vergleicht, die von generischen Algorithmen wie qsort verwendet wird.
Deine Funktion sollte die beiden Werte vergleichen und ein Ergebnis zurückgeben, das ihre Reihenfolge angibt.
Konvention für Rückgabewerte:
- Gib einen negativen Wert zurück, wenn die erste Ganzzahl vor der zweiten kommt (first < second)
- Gib null zurück, wenn beide Ganzzahlen gleich sind
- Gib einen positiven Wert zurück, wenn die erste Ganzzahl nach der zweiten kommt (first > second)
Parameter:
a(int): Die erste zu vergleichende Ganzzahlb(int): Die zweite zu vergleichende Ganzzahl
Rückgabe: Eine Ganzzahl, die die Reihenfolge angibt: negativ, wenn a < b, null, wenn a == b, positiv, wenn a > b.
Hinweis: Der Subtraktionstrick aus der Lektion ermöglicht eine elegante einzeilige Lösung.
Probier es selbst
int compare_ints(int a, int b) {
// Schreibe hier Code
}
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Objektorientierte Programmierung
1Grundlagen der modularen Programmierung
Header-DateienInclude GuardsQuelldateienStatische FunktionenWiederholung: Modularer Taschenrechner4Kapselung
Konzept der Opaque PointersOpaque Structs definierenGetter und SetterValidierung in SetternRückblick: Die geheime Box7Funktionszeiger
Funktionszeiger deklarierenFunktionszeiger aufrufenTypedef für FunktionszeigerFunktionen als Argumente übergebenZusammenfassung: Calculator Dispatch10Generische Container
Wiederholung: Void-PointerGenerischer WrapperGenerisches SwapGenerisches VergleichenWiederholung: Generisches Array2Objekte und Methoden
Structs als ObjekteDer 'Self'-PointerConst-CorrectnessPointer vs. WertHilfsmethodenZusammenfassung: Point Manager5Projekt: Einfaches Bankkonto
Projekt-SetupImplementierung des Kontos3Objekt-Lebenszyklus
Konstruktor-MusterDestruktor-MusterStack-InitialisierungTiefe KopieRückblick: String-Wrapper6Vererbung durch Komposition
Struct-EinbettungDie First-Member-RegelZugriff auf Parent-MemberUpcastingRückblick: Formenhierarchie9Projekt: Formen-Zeichner
ProjektübersichtKreis-ImplementierungRechteck-ImplementierungPolymorphe VerwendungShape-ContainerÜbe selbstständig: Online-C-Compiler