Callback-Funktion in C

Hallo, angehende Programmierer! Heute tauchen wir in die faszinierende Welt der Callback-Funktionen in C ein. Als dein freundlicher Nachbarschaftsinformatiklehrer freue ich mich darauf, dich durch dieses Konzept zu führen. Glaub mir, wenn du Callbacks einmal verstanden hast, wirst du das Gefühl haben, eine neue Superkraft im Programmieren entsperrt zu haben!

C - Callback Function

Was ist eine Callback-Funktion?

Lassen wir mit den Grundlagen beginnen. Stell dir vor, du bist auf einer Pizza-Party (wer liebt nicht Pizza?) und bittest deinen Freund, dich anzurufen, wenn die Pizza ankommt. Dein Freund führt im Grunde eine Callback-Aktion durch - er ruft dich zurück, wenn ein bestimmtes Ereignis eintritt.

In der C-Programmierung funktioniert eine Callback-Funktion ähnlich. Es ist eine Funktion, die wir als Argument an eine andere Funktion übergeben. Diese andere Funktion ruft dann die übergebene Funktion zurück (führt sie aus), wenn ein bestimmtes Ereignis eintritt oder eine Aufgabe abgeschlossen ist.

Hier ist eine einfache Struktur einer Callback-Funktion:

void callback_function() {
// Funktionskörper
}

void main_function(void (*callback)()) {
// Einiger Code
callback();  //_Callback-Funktion aufrufen_
// Mehr Code
}

int main() {
main_function(callback_function);
return 0;
}

In diesem Beispiel ist callback_function unser Callback. Wir übergeben sie an main_function, die sie dann zu einem bestimmten Zeitpunkt während ihrer Ausführung aufruft.

Beispiel einer Callback-Funktion in C

Sehen wir uns ein konkretes Beispiel an. Wir erstellen ein einfaches Programm, das eine Callback-Funktion verwendet, um eine Nachricht auszugeben, wenn eine Berechnung abgeschlossen ist.

#include <stdio.h>

// Unsere Callback-Funktion
void print_result(int result) {
printf("Das Ergebnis ist: %d\n", result);
}

// Funktion, die eine Berechnung durchführt und den Callback aufruft
void perform_operation(int a, int b, void (*callback)(int)) {
int sum = a + b;
callback(sum);  // Callback-Funktion mit dem Ergebnis aufrufen
}

int main() {
perform_operation(5, 3, print_result);
return 0;
}

In diesem Beispiel:

  1. Wir definieren eine Callback-Funktion print_result, die einen Integer annimmt und ihn ausgibt.
  2. Unsere perform_operation-Funktion nimmt zwei Integer und einen Funktion指针 als Argumente.
  3. Innerhalb von perform_operation berechnen wir die Summe und rufen dann die Callback-Funktion mit dieser Summe auf.
  4. In main rufen wir perform_operation mit unseren Zahlen und der print_result-Callback auf.

Wenn du dieses Programm ausführst, wird es ausgeben: "Das Ergebnis ist: 8"

Callback-Funktion mit Argumenten

Callbacks können auch mehrere Argumente annehmen. Lassen wir unser vorheriges Beispiel erweitern, um mehr Operationen hinzuzufügen:

#include <stdio.h>

// Callback-Funktion mit mehreren Argumenten
void print_operation(char operation, int a, int b, int result) {
printf("%d %c %d = %d\n", a, operation, b, result);
}

// Funktion, die eine Berechnung durchführt und den Callback aufruft
void perform_operation(int a, int b, char op, void (*callback)(char, int, int, int)) {
int result;
switch(op) {
case '+': result = a + b; break;
case '-': result = a - b; break;
case '*': result = a * b; break;
case '/': result = a / b; break;
default: printf("Ungültige Operation\n"); return;
}
callback(op, a, b, result);
}

int main() {
perform_operation(5, 3, '+', print_operation);
perform_operation(10, 4, '-', print_operation);
perform_operation(7, 2, '*', print_operation);
perform_operation(20, 5, '/', print_operation);
return 0;
}

Dieses Programm wird ausgeben:

5 + 3 = 8
10 - 4 = 6
7 * 2 = 14
20 / 5 = 4

Hier nimmt unsere Callback print_operation vier Argumente an: die Operation, zwei Operanden und das Ergebnis. Dies ermöglicht uns eine flexiblere und informativere Ausgabe.

Arten von Callbacks in C

In C können wir Callbacks in zwei Haupttypen einteilen:

  1. Synchrone Callbacks: Diese werden sofort von der Funktion ausgeführt, der sie übergeben wurden. Unsere Beispiele oben sind synchrone Callbacks.

  2. Asynchrone Callbacks: Diese werden später ausgeführt, oft in ereignisgetriebener Programmierung oder bei I/O-Operationen verwendet.

Sehen wir uns eine Tabelle zur Zusammenfassung dieser Typen an:

Typ Beschreibung Verwendungszweck Beispiel
Synchron Sofort ausgeführt Einfache Operationen, Berechnungen Unser Beispiel für arithmetische Operationen
Asynchron Später ausgeführt Ereignisverarbeitung, I/O-Operationen Dateilesen/Schreiben Callbacks, GUI-Ereignis-Handler

Hier ist ein einfaches Beispiel für einen asynchronen Callback mit Signalen in C:

#include <stdio.h>
#include <signal.h>
#include <unistd.h>

void callback_function(int signum) {
printf("Signal %d empfangen\n", signum);
}

int main() {
signal(SIGALRM, callback_function);
alarm(5);  // Alarm für 5 Sekunden setzen

printf("Warte auf Alarm...\n");
pause();  // Auf ein Signal warten

return 0;
}

In diesem Beispiel wird callback_function als asynchroner Callback eingerichtet, der aufgerufen wird, wenn das SIGALRM-Signal empfangen wird. Die alarm(5)-Funktion setzt einen Timer für 5 Sekunden, nach denen das SIGALRM-Signal gesendet wird, was unseren Callback auslöst.

Und das war's, Leute! Wir haben die Welt der Callback-Funktionen in C durchquert. Denke daran, Callbacks sind wie treue Sidekicks in deinen Programmierabenteuern - sie sind immer da, wenn du sie brauchst, bereit, in Aktion zu treten. Übe weiter, und bald wirst du Callbacks wie ein Profi einsetzen können!

Credits: Image by storyset