Qu'est ce qu'un “rappel” en C et comment sont-ils mis en œuvre?
De la lecture que j'ai fait, Core Audio s'appuie fortement sur les rappels (et C++, mais c'est une autre histoire).
Je comprends le concept (un peu) de la création d'une fonction qui est appelée par une autre fonction à plusieurs reprises pour accomplir une tâche. Je ne comprends pas comment ils mettre en place et comment ils fonctionnent. Des exemples seraient appréciées.
Vous devez vous connecter pour publier un commentaire.
Il n'y a pas de "rappel" en C - pas plus que toute autre programmation générique concept.
Ils sont mis en œuvre en utilisant des pointeurs de fonction. Voici un exemple:
Ici, le
populate_array
fonction prend un pointeur de fonction en tant que troisième paramètre, et l'appelle pour obtenir les valeurs pour remplir le tableau avec. Nous avons écrit le rappelgetNextRandomValue
, qui renvoie un hasard-ish valeur, et passé un pointeur àpopulate_array
.populate_array
appelle notre fonction de rappel 10 fois et attribuer les valeurs renvoyées aux éléments dans le tableau donné.Voici un exemple de rappels dans C.
Disons que vous voulez écrire du code qui permet l'enregistrement des rappels à être appelé lorsqu'un événement se produit.
D'abord définir le type de fonction utilisé pour le rappel:
Maintenant, de définir une fonction qui est utilisée pour enregistrer un rappel:
C'est ce à quoi ressemblerait le code qui enregistre une fonction de callback:
Dans les entrailles de l'event dispatcher, le rappel peut être stockée dans une structure qui ressemble à quelque chose comme ceci:
C'est ce à quoi ressemble le code qui exécute une fonction de rappel.
libsrtp
donne pas d'avertissements. Je présume que, ensuite, que lorsque ce type apparaît comme un argument de fonction, il est nécessaire de se désintègre à un pointeur de fonction, tout comme les matrices de décomposition de pointeurs vers leurs premiers éléments, de sorte que la même chose se produit à la fin de toute façon. est intéressant, cependant, que les discussions de ces typedefs que j'ai trouvé ne sont même pas coup d'œil à cet aspect, plutôt se concentrer sur les déclarer des prototypes ou des pointeurs avec elleUn simple retour d'appel du programme. Espère que ça répond à votre question.
Une fonction de rappel en C est l'équivalent du paramètre d'une fonction /variable assignée à être utilisé dans une autre fonction.Wiki Exemple
Dans le code ci-dessous,
La fonction (*numberSource) à l'intérieur de l'appel de la fonction PrintTwoNumbers est une fonction de "call back" /exécuter à partir de l'intérieur de PrintTwoNumbers comme dicté par le code tel qu'il fonctionne.
Donc, si vous aviez quelque chose comme un pthread fonction, vous pouvez attribuer une autre fonction à exécuter à l'intérieur de la boucle de son instanciation.
Rappels de C sont généralement mises en œuvre à l'aide de pointeurs de fonction et d'un pointeur de données. Vous passez votre fonction
on_event()
et les pointeurs de données à un cadre de la fonctionwatch_events()
(par exemple). Lorsqu'un événement se produit, votre fonction est appelée avec vos données et les données spécifiques aux événements.Rappels sont également utilisés dans la programmation GUI. Le GTK+ tutoriel a une belle section sur la la théorie des signaux et des rappels.
Ce article de wikipedia a un exemple dans C.
Un bon exemple est que les nouveaux modules écrit pour augmenter le serveur Web Apache registre avec les principaux processus apache en les passant pointeurs de fonction de sorte que ces fonctions sont appelées à dos pour traiter les demandes web page.
Un rappel C est une fonction qui est fourni à une autre fonction de "rappel" à un moment donné de l'autre fonction est de faire de sa tâche.
Il y a deux moyens qu'un rappel est utilisé: synchrone de rappel et rappel asynchrone. Synchrone de rappel est fourni à une autre fonction qui va faire une tâche, puis retour à l'appelant avec la tâche à accomplir. Un rappel asynchrone est fourni à une autre fonction qui va démarrer une tâche, puis retour à l'appelant avec la tâche peut-être pas terminé.
Synchrone de rappel est généralement utilisé pour fournir un délégué d'une autre fonction pour laquelle l'autre fonction délègue une partie de l'étape de la tâche. Des exemples classiques de cette délégation sont les fonctions
bsearch()
etqsort()
de la Bibliothèque C Standard. Ces deux fonctions prennent un rappel qui est utilisé au cours de la tâche, la fonction est de fournir, de sorte que le type de données recherchées, dans le cas debsearch()
, ou triées, dans le cas deqsort()
, n'a pas besoin d'être connu par la fonction en cours d'utilisation.Par exemple, ici est un petit exemple de programme avec
bsearch()
à l'aide de différentes fonctions de comparaison, synchrone rappels. En ce qui nous permet de déléguer la comparaison des données à une fonction de rappel, lebsearch()
fonction nous permet de décider au moment de l'exécution de ce genre de comparaison que nous voulons utiliser. C'est synchrone, car lorsque lebsearch()
fonction renvoie la tâche est terminée.Un rappel asynchrone est différent en ce que lorsque la fonction appelée à qui nous fournissons un callback retourne, la tâche peut ne pas être terminé. Ce type de callback est souvent utilisé avec des I/O asynchrone dans lequel une opération d'e/S est de commencer et puis quand il est terminé, la fonction de rappel est appelée.
Dans le programme suivant, nous créons un socket pour écouter les demandes de connexion TCP et lorsqu'une demande est reçue, la fonction de faire de l'écoute puis appelle la fonction de rappel prévue. Cette application simple peut être exercé en l'exécutant dans une fenêtre lors de l'utilisation du
telnet
utilitaire ou un navigateur web pour essayer de vous connecter dans une autre fenêtre.J'ai levé la plupart des WinSock code à partir de l'exemple de Microsoft fournit avec le
accept()
fonction à https://msdn.microsoft.com/en-us/library/windows/desktop/ms737526(v=vs. 85).aspxCette application démarre un
listen()
sur l'hôte local, 127.0.0.1, en utilisant le port 8282 de sorte que vous pourriez utilisertelnet 127.0.0.1 8282
ouhttp://127.0.0.1:8282/
.Cet exemple d'application a été créé comme une application de console Visual Studio 2017 Community Edition et c'est à l'aide de Microsoft WinSock version de sockets. Pour une application Linux WinSock fonctions devra être remplacé avec le Linux solutions de rechange et les threads Windows, bibliothèque de l'utilisation
pthreads
à la place.Habituellement, cela peut être fait en utilisant un pointeur de fonction, qui est une variable spéciale qui pointe vers l'emplacement mémoire de la fonction. Vous pouvez ensuite l'utiliser pour appeler la fonction avec des arguments précis. Donc, il y aura probablement une fonction qui définit la fonction de rappel. Ceci permettra d'accepter un pointeur de fonction et ensuite le stocker cette adresse quelque part où il peut être utilisé. Après que lorsque l'événement est déclenché, il fera appel de cette fonction.
Il est beaucoup plus facile de comprendre une idée par exemple.
Ce qui a été dit sur la fonction de rappel dans C jusqu'à présent sont d'excellentes réponses, mais probablement le plus grand avantage de l'utilisation de la fonctionnalité est pour avoir un code propre et bien rangé.
Exemple
Suivants du code C implémente le tri rapide.
La ligne la plus intéressante dans le code ci-dessous est celui-ci, où l'on peut voir la fonction de rappel dans l'action:
La compare_s2b est le nom de la fonction qsort() pour appeler la fonction. Cela permet de maintenir qsort() de façon aérée (donc plus facile à entretenir). Vous venez d'appeler une fonction par nom à partir de l'intérieur d'une autre fonction (bien sûr, le prototype de fonction de la déclaration, au moins, doivent precde avant elle peut être appelée à partir d'une autre fonction).
Le Code Complet