In C gibt es keinen "Rückruf" - nicht mehr als bei jedem anderen generischen Programmierkonzept.
Sie werden mithilfe von Funktionszeigern implementiert. Hier ist ein Beispiel:
void populate_array(int *array, size_t arraySize, int (*getNextValue)(void))
{
for (size_t i=0; i<arraySize; i++)
array[i] = getNextValue();
}
int getNextRandomValue(void)
{
return rand();
}
int main(void)
{
int myarray[10];
populate_array(myarray, 10, getNextRandomValue);
...
}
Hier nimmt die populate_array
Funktion einen Funktionszeiger als dritten Parameter und ruft ihn auf, um die Werte abzurufen, mit denen das Array gefüllt werden soll. Wir haben den Rückruf geschrieben getNextRandomValue
, der einen zufälligen Wert zurückgibt, und einen Zeiger darauf übergeben populate_array
. populate_array
ruft unsere Rückruffunktion 10 Mal auf und weist die zurückgegebenen Werte den Elementen im angegebenen Array zu.
Hier ist ein Beispiel für Rückrufe in C.
Angenommen, Sie möchten einen Code schreiben, mit dem die Registrierung von Rückrufen aufgerufen werden kann, wenn ein Ereignis auftritt.
Definieren Sie zunächst den Funktionstyp, der für den Rückruf verwendet wird:
Definieren Sie nun eine Funktion, mit der ein Rückruf registriert wird:
So würde Code aussehen, der einen Rückruf registriert:
In den Interna des Ereignis-Dispatchers kann der Rückruf in einer Struktur gespeichert werden, die ungefähr so aussieht:
So sieht der Code aus, der einen Rückruf ausführt.
quelle
libsrtp
gibt keine Warnungen. Ich gehe also davon aus, dass, wenn ein solcher Typ als Funktionsargument erscheint, er in einen Zeiger auf eine Funktion "zerfallen" muss, genau wie Arrays in Zeiger auf ihre ersten Elemente zerfallen, so dass am Ende dasselbe passiert in jedem Fall. Es ist jedoch interessant, dass Diskussionen über solche Typedefs, die ich gefunden habe, nicht einmal einen Blick auf diesen Aspekt werfen, sondern sich darauf konzentrieren, Prototypen oder Zeiger damit zu deklarierenEin einfaches Rückrufprogramm. Hoffe es beantwortet deine Frage.
quelle
Eine Rückruffunktion in C entspricht einem Funktionsparameter / einer Funktionsvariablen, die zur Verwendung in einer anderen Funktion zugewiesen wurde. Wiki-Beispiel
Im folgenden Code
Die Funktion (* numberSource) innerhalb des Funktionsaufrufs PrintTwoNumbers ist eine Funktion zum "Zurückrufen" / Ausführen aus PrintTwoNumbers heraus, wie vom Code während der Ausführung vorgegeben.
Wenn Sie also so etwas wie eine pthread-Funktion hatten, können Sie eine andere Funktion zuweisen, die ab der Instanziierung innerhalb der Schleife ausgeführt wird.
quelle
Ein Rückruf in C ist eine Funktion, die einer anderen Funktion zur Verfügung gestellt wird, um sie irgendwann zurückzurufen, wenn die andere Funktion ihre Aufgabe erfüllt.
Es gibt zwei Möglichkeiten, wie ein Rückruf verwendet wird : synchroner Rückruf und asynchroner Rückruf. Ein synchroner Rückruf wird an eine andere Funktion gesendet, die eine Aufgabe ausführt und dann mit abgeschlossener Aufgabe zum Anrufer zurückkehrt. Ein asynchroner Rückruf wird an eine andere Funktion gesendet, die eine Aufgabe startet und dann mit möglicherweise nicht abgeschlossener Aufgabe zum Aufrufer zurückkehrt.
Ein synchroner Rückruf wird normalerweise verwendet, um einen Delegaten an eine andere Funktion bereitzustellen, an die die andere Funktion einen Schritt der Aufgabe delegiert. Klassische Beispiele für diese Delegation sind die Funktionen
bsearch()
undqsort()
aus der C-Standardbibliothek. Diese beiden Funktionen nehmen einen Rückruf entgegen, der während der von der Funktion bereitgestellten Aufgabe verwendet wird, so dass der Typ der Daten im Fall von durchsucht oder im Fall vonbsearch()
sortiert wirdqsort()
der Funktion nicht bekannt sein muss gebraucht.Zum Beispiel ist hier ein kleines Beispielprogramm mit
bsearch()
verschiedenen Vergleichsfunktionen, synchronen Rückrufen. Indem wir den Datenvergleich an eine Rückruffunktion delegieren können,bsearch()
können wir zur Laufzeit entscheiden, welche Art von Vergleich wir verwenden möchten. Dies ist synchron, dabsearch()
die Aufgabe abgeschlossen ist, wenn die Funktion zurückgegeben wird.Ein asynchroner Rückruf unterscheidet sich darin, dass die Aufgabe möglicherweise nicht abgeschlossen wird, wenn die aufgerufene Funktion, für die wir einen Rückruf bereitstellen, zurückkehrt. Diese Art von Rückruf wird häufig bei asynchronen E / A verwendet, bei denen eine E / A-Operation gestartet wird. Wenn sie abgeschlossen ist, wird der Rückruf aufgerufen.
Im folgenden Programm erstellen wir einen Socket zum Abhören von TCP-Verbindungsanforderungen. Wenn eine Anforderung empfangen wird, ruft die Funktion, die das Abhören ausführt, die bereitgestellte Rückruffunktion auf. Diese einfache Anwendung kann ausgeführt werden, indem Sie sie in einem Fenster ausführen, während Sie mit dem
telnet
Dienstprogramm oder einem Webbrowser versuchen, eine Verbindung in einem anderen Fenster herzustellen.Ich habe den größten Teil des WinSock-Codes aus dem Beispiel entfernt, das Microsoft mit der
accept()
Funktion unter https://msdn.microsoft.com/en-us/library/windows/desktop/ms737526(v=vs.85).aspx bereitstelltDiese Anwendung startet a
listen()
auf dem lokalen Host 127.0.0.1 über Port 8282, sodass Sie entwedertelnet 127.0.0.1 8282
oder verwenden könnenhttp://127.0.0.1:8282/
.Diese Beispielanwendung wurde als Konsolenanwendung mit Visual Studio 2017 Community Edition erstellt und verwendet die Microsoft WinSock-Version von Sockets. Für eine Linux-Anwendung müssten die WinSock-Funktionen durch die Linux-Alternativen ersetzt werden, und
pthreads
stattdessen würde die Windows-Thread-Bibliothek verwendet .quelle
Rückrufe in C werden normalerweise unter Verwendung von Funktionszeigern und einem zugehörigen Datenzeiger implementiert. Sie übergeben Ihre Funktions-
on_event()
und Datenzeiger beispielsweise an eine Framework-Funktionwatch_events()
. Wenn ein Ereignis eintritt, wird Ihre Funktion mit Ihren Daten und einigen ereignisspezifischen Daten aufgerufen.Rückrufe werden auch in der GUI-Programmierung verwendet. Das GTK + Tutorial enthält einen schönen Abschnitt zur Theorie der Signale und Rückrufe .
quelle
Dieser Wikipedia-Artikel enthält ein Beispiel in C.
Ein gutes Beispiel ist, dass neue Module, die geschrieben wurden, um das Apache-Webserverregister mit dem Haupt-Apache-Prozess zu erweitern, indem sie Funktionszeiger übergeben, sodass diese Funktionen zurückgerufen werden, um Webseitenanforderungen zu verarbeiten.
quelle
Normalerweise kann dies mithilfe eines Funktionszeigers erfolgen, dh einer speziellen Variablen, die auf den Speicherort einer Funktion verweist. Sie können dies dann verwenden, um die Funktion mit bestimmten Argumenten aufzurufen. Es wird also wahrscheinlich eine Funktion geben, die die Rückruffunktion festlegt. Dies akzeptiert einen Funktionszeiger und speichert diese Adresse dann irgendwo, wo sie verwendet werden kann. Wenn danach das angegebene Ereignis ausgelöst wird, wird diese Funktion aufgerufen.
quelle
Es ist viel einfacher, eine Idee anhand eines Beispiels zu verstehen. Was bisher über die Rückruffunktion in C gesagt wurde, sind großartige Antworten, aber der wahrscheinlich größte Vorteil der Verwendung dieser Funktion besteht darin, den Code sauber und übersichtlich zu halten.
Beispiel
Der folgende C-Code implementiert eine schnelle Sortierung. Die interessanteste Zeile im folgenden Code ist diese, in der wir die Rückruffunktion in Aktion sehen können:
Compare_s2b ist der Name der Funktion, mit der qsort () die Funktion aufruft. Dadurch bleibt qsort () übersichtlich (daher einfacher zu warten). Sie rufen eine Funktion nur innerhalb einer anderen Funktion beim Namen auf (natürlich muss zumindest die Funktionsprototypdeklaration vorangestellt werden, bevor sie von einer anderen Funktion aufgerufen werden kann).
Der vollständige Code
quelle