Funktionen als Argumente übergeben
Teil des Abschnitts Objektorientierte Programmierung der C-Journey von Coddy. Lektion 36 von 61.
Eine der leistungsfähigsten Anwendungen von Funktionszeigern besteht darin, sie als Argumente an andere Funktionen zu übergeben. Dadurch kannst du benutzerdefiniertes Verhalten in eine Funktion einschleusen, ohne ihren Code zu ändern: eine Technik, die manchmal als Callback bezeichnet wird.
Betrachte eine Funktion, die eine Berechnung mit zwei Zahlen durchführt. Anstatt die Operation fest zu codieren, kannst du einen Funktionszeiger akzeptieren, der festlegt, welche Operation ausgeführt werden soll:
typedef int (*Operation)(int, int);
int compute(int a, int b, Operation op) {
return op(a, b);
}Die Funktion compute weiß nicht, ob sie addiert, subtrahiert oder etwas völlig anderes tut. Sie ruft einfach die Funktion auf, die ihr übergeben wird:
int add(int a, int b) { return a + b; }
int multiply(int a, int b) { return a * b; }
int main() {
printf("%d\n", compute(5, 3, add)); // Ausgabe: 8
printf("%d\n", compute(5, 3, multiply)); // Ausgabe: 15
return 0;
}Beachte, wie dieselbe Funktion compute je nachdem, welche Funktion wir übergeben, unterschiedliche Ergebnisse liefert. Dieses Muster ist grundlegend für das Schreiben von flexiblem, wiederverwendbarem Code. Du schreibst die Struktur einmal, und die Nutzer deiner Funktion stellen die spezifische Logik bereit, die sie benötigen.
Aufgabe
EinfachSchreibe eine Funktion apply_twice, die zwei Ganzzahlen und einen Operationscode entgegennimmt, die Operation zweimal hintereinander auf die Zahlen anwendet und das Endergebnis zurückgibt.
Deine Funktion erhält einen Operationscode, der bestimmt, welche Operation verwendet werden soll. Du musst die Operationsfunktionen innerhalb deiner Lösung definieren und sie an eine Hilfsfunktion compute übergeben, die einen Funktionszeiger akzeptiert.
Hinweis: Es werden nur die Funktionen benötigt. Die Tests rufen apply_twice direkt auf und prüfen den Rückgabewert. Lies daher keine Eingaben ein und gib nichts aus.
Erforderliche Struktur:
- Definiere ein
typedefnamensOperationfür einen Funktionszeiger, der zweiint-Parameter entgegennimmt und einenintzurückgibt - Definiere zwei Operationsfunktionen:
add(gibt a + b zurück) undmultiply(gibt a * b zurück) - Definiere eine Funktion
compute, die zwei Ganzzahlen und einenOperation-Funktionszeiger entgegennimmt und anschließend das Ergebnis des Aufrufs der Operation zurückgibt - Wähle in
apply_twiceabhängig vom Code die passende Operation aus und verwende anschließend zweimalcompute: zuerst mit den ursprünglichen Zahlen, dann erneut mit dem Ergebnis und der zweiten Zahl
Logik:
- Wähle die Operationsfunktion abhängig von
op_codeaus (1 = add, 2 = multiply) - Rufe
compute(a, b, operation)auf, um ein Zwischenergebnis zu erhalten - Rufe
compute(intermediate, b, operation)auf, um das Endergebnis zu erhalten - Gib das Endergebnis zurück
Parameter:
a(int): Erste Zahlb(int): Zweite Zahlop_code(int): Operationscode (1 für add, 2 für multiply)
Rückgabe: Das Ergebnis, nachdem die Operation zweimal hintereinander angewendet wurde (int)
Beispiel: Mit a = 5, b = 3, op_code = 1 (add):
- Erste Berechnung: 5 + 3 = 8
- Zweite Berechnung: 8 + 3 = 11
- Rückgabe: 11
Mit a = 2, b = 4, op_code = 2 (multiply):
- Erste Berechnung: 2 × 4 = 8
- Zweite Berechnung: 8 × 4 = 32
- Rückgabe: 32
Probier es selbst
int apply_twice(int a, int b, int op_code) {
// Schreibe hier den 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 Dispatch2Objekte 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