J'ai un PIC18F46K22 et je le programme avec le compilateur XC8. Au final, j'aurai un système comme un pc avec stdin
et stdout
. Donc, dans la boucle principale, il y aura une fonction qui vérifie s'il y a une nouvelle entrée. S'il y a une entrée, une fonction sera appelée en conséquence. Ainsi, par exemple, lorsque j'entre un A stdin
, le PIC exécute une fonction similaire function_A
à celle function_B
qui est appelée lorsque j'entre un B.
Lorsque le PIC est terminé avec la fonction, je veux que la nouvelle entrée soit envoyée à la fonction. Donc, lorsque vous appuyez sur A ouvre l'émetteur RS232, à partir de ce moment, chaque entrée sera envoyée via RS232. Au final, le projet est un éditeur de texte autonome. Ainsi, lorsque vous appuyez sur A pour ouvrir le système de fichiers, à partir de ce moment, vous ne modifiez plus de texte mais vous parcourez une liste de fichiers. Cela signifie qu'appuyer sur Haut et Bas signifie quelque chose de différent que dans l'environnement d'édition de texte.
J'ai beaucoup réfléchi à la façon de programmer cela en C. J'ai pensé cela hier soir et j'aimerais savoir si c'est possible et si oui, comment. Ce que je veux faire c'est:
- La
main
fonction appelle une fonction commefunction_A
function_A
change une variable globalefunction_addr
en pointeur d'adresse de la fonctionin_function_A
- À partir de ce moment,
main
appelle la fonctionfunction_addr
lorsqu'il y a une nouvelle entrée.
Donc, ce dont j'ai besoin, c'est d'une main
fonction qui vérifie si elle function_addr
est nulle. Si c'est le cas, une fonction «normale» devrait être appelée, comme function_A
. Si ce n'est pas le cas, la fonction at function_addr
doit être appelée. J'ai également besoin d'un function_A
qui change le function_addr
en un pointeur in_function_A
.
Remarque: lorsque la fonction de système de fichiers doit être fermée, elle is_function_A
doit simplement passer function_addr
à 0.
Donc, fondamentalement, ma question est de savoir comment puis-je
- Récupère l'adresse d'une fonction (et la stocke dans une variable)
- Appeler une fonction à une adresse spécifiée
Réponses:
Une fonction
Récupère l'adresse d'une fonction (et la stocke dans une variable)
Appeler une fonction à une adresse spécifiée
la source
fp(12)
n'augmente pas la lisibilité(*fp)(12)
. Ils ont une lisibilité différente.(*fp)(12)
rappelle au lecteur qu'ilfp
s'agit d'un pointeur et qu'il ressemble également à la déclaration defp
. Dans mon esprit, ce style est associé à d'anciennes sources, comme les internes X11, et K&R C.Une raison possible qu'il pourrait être associé à K&R C est parce qu'en ANSI C, il est possible de déclarer enfp
utilisant la syntaxe de fonction, sifp
c'est un paramètre:int func(int fp(double)) {}
. Dans K&R C, cela aurait été le casint func(fp) int (*fp)(double); { ... }
.Bien que la réponse de Wouters soit absolument correcte, cela peut être plus convivial pour les débutants et un meilleur exemple concernant votre question.
S'il n'est pas évident que le pointeur de fonction a réellement une adresse de fonction cible assignée, il est sage d'effectuer une vérification NULL.
la source
fp
se trouve occuper est en fait NULL au départ. Je feraisint (*fp)(int) = NULL;
une déclaration et une initialisation combinées pour être certain - vous ne voulez pas sauter à un emplacement de mémoire aléatoire à cause d'une valeur maladroite qui se trouve justement être là. Ensuite, affectez simplementfp
comme dans votreExample()
fonction.fp
s'agit d'une "variable globale" (comme dans le code ci-dessus), alors il est garanti d'être initialisé àNULL
(sans avoir à le faire explicitement).