Ich habe einen PIC18F46K22 und programmiere ihn mit dem XC8-Compiler. Am Ende habe ich ein System wie ein PC mit stdin
und stdout
. In der Hauptschleife gibt es also eine Funktion, die prüft, ob neue Eingaben vorliegen. Bei Eingabe wird eine Funktion entsprechend aufgerufen. So zum Beispiel , wenn ich Eingang eines A auf stdin
, läuft der PIC eine Funktion wie function_A
statt function_B
dem aufgerufen wird , wenn ich Eingabe eines B.
Wenn der PIC mit der Funktion fertig ist, möchte ich, dass die neue Eingabe an die Funktion gesendet wird. Wenn Sie also A drücken, wird der RS232-Sender geöffnet. Ab diesem Moment wird jeder Eingang über RS232 gesendet. Am Ende ist das Projekt ein eigenständiger Texteditor. Wenn Sie also A drücken, wird das Dateisystem geöffnet. Von diesem Moment an sind Sie nicht mehr an der Textbearbeitung beteiligt, sondern durchsuchen eine Liste von Dateien. Das bedeutet, dass das Drücken von Nach oben und Nach unten etwas anderes bedeutet als in der Textbearbeitungsumgebung.
Ich habe viel darüber nachgedacht, wie ich das in C programmieren soll. Ich habe mir das letzte Nacht ausgedacht und würde gerne wissen, ob es möglich ist und wenn ja, wie. Was ich machen möchte ist:
- Die
main
Funktion ruft eine Funktion wiefunction_A
function_A
Ändert eine globale Variablefunction_addr
in den Adresszeiger der Funktionin_function_A
main
Ruft die Funktion von diesem Moment an auf,function_addr
wenn neue Eingaben vorliegen.
Ich brauche also eine main
Funktion, die prüft, ob function_addr
Null ist. Wenn ja, sollte eine 'normale' Funktion aufgerufen werden function_A
. Ist dies nicht der function_addr
Fall , muss die Funktion at aufgerufen werden. Ich brauche auch einen, function_A
der den function_addr
in einen Zeiger ändert in_function_A
.
Hinweis: Wenn die Dateisystemfunktion geschlossen werden is_function_A
soll , sollte nur function_addr
auf 0 geändert werden .
Im Grunde ist meine Frage, wie ich kann
- Ruft die Adresse einer Funktion ab (und speichert sie in einer Variablen)
- Rufen Sie eine Funktion an einer angegebenen Adresse auf
Antworten:
Eine Funktion
Ruft die Adresse einer Funktion ab (und speichert sie in einer Variablen)
Rufen Sie eine Funktion an einer angegebenen Adresse auf
quelle
fp(12)
erhöht die Lesbarkeit nicht um(*fp)(12)
. Sie haben unterschiedliche Lesbarkeit.(*fp)(12)
erinnert den Leser daran, dassfp
es sich um einen Zeiger handelt, und ähnelt auch der Deklaration vonfp
. Meiner Meinung nach ist dieser Stil mit alten Quellen wie X11-Interna und K & R C verknüpft. Ein möglicher Grund für die Verknüpfung mit K & R C ist, dass in ANSI C die Deklarationfp
mithilfe der Funktionssyntax möglich ist , sofernfp
es sich um einen Parameter handelt:int func(int fp(double)) {}
. Bei K & R C wäre das gewesenint func(fp) int (*fp)(double); { ... }
.Während Wouters Antwort absolut richtig ist, ist dies vielleicht eher einsteigerfreundlich und ein besseres Beispiel für Ihre Frage.
Wenn es nicht offensichtlich ist, dass dem Funktionszeiger tatsächlich eine Zielfunktionsadresse zugewiesen wurde, ist es ratsam, eine NULL-Prüfung durchzuführen.
quelle
fp
die gerade belegt wird, anfänglich NULL ist. Ich würde diesint (*fp)(int) = NULL;
als kombinierte Deklaration und Initialisierung tun, um sicherzugehen - Sie möchten nicht zu einem zufälligen Speicherort springen, weil ein doofer Wert gerade da war. Dann weisenfp
Sie einfach wie in IhrerExample()
Funktion.fp
es sich um eine "globale Variable" handelt (wie im obigen Code), wird sie garantiert initialisiertNULL
(ohne dies explizit tun zu müssen).