ich würde mir gerne (für Debuggingzwecke) den Funktionsnamen ausgeben lassen, auf den ein Funktionspointer zeigt.
Ich poste mal die vermeindlich relevanten Code-Teile:
typedef void(*pF)(void); // Pointer to void void FCN
...
void add(bool enable=1, bool first_delay=0, bool immediately=0,
pF pFCN=NULL, u_int periode=1, u_int offset=0, int cnt=-1)
...
FL.add(1,0,0,&FCN1,1000,0,-1); // assigning pointer to FCN1
... serial.print(p->fcn.pFCN); // mein kläglicher Versuch "FCN1" an die RS232 zu senden
Wie muss ich es stattdessen machen? Letztendlich will ich ja nicht den Pointer selbst, sondern den Namen der Funktion auf die er zeigt. Da endet mein Wissen schon.
So einfach wirds nicht .....
Denn C/C++ ist keine Interpreter Sprache.
Die Funktionsnamen stehen nicht im Code.
Ein paar Möglichkeiten fallen mir ein, das Ziel wenigstens Ansatzweise, zu erreichen.....
Den Pointer kannst du ja auslesen.
Die Adresse der Funktion ist also erreichbar.
Variante 1:
Du könntest ein Array mit Funktionsnamen und Adressen anlegen.
Dann suchst du, bei der Ausgabe, nach dem Namen und gibst den aus.
Variante 2:
Du lässt dir die Adresse ausgeben und suchst im Dissassemblerlisting die Adresse und es zeigt dir die Funktion.
Zu was brauchst Du das denn eigentlich?
Es ist doch vollig egal wohin im Speicher ein Funktionspointer zeigt, solange er auf die Funktion zeigt.
Grüße Uwe
ich nehme mal an, Du willst wissen, ob er in die "richtige" funktion springt...
dann schreib' doch einfach an den anfang der funktion ein Serial.println("funktionsname") rein.
eventuell auch eins direkt vor dem sprung. dann hast Du immer das woher > wohin beieinander...
Vielen Dank an alle für die schnellen und reichlichen Antworten!
Ja es ist "nur" fürs Debugging, also ein print-Statement in der Funktion ist völlig ausreichend!
Ich habe mir mal folgendes definiert: #define DEBUG(i); SPF(">D: ");SP(LINE);SPF(" # ");SP(i);SPF(" * ms: ");SPL(mils());
wobei ich für das Serial.print(<F(>...)); auch zu faul bin: #define SP(x) Serial.print(x) #define SPF(x) SP(F(x)) #define SPL(x) Serial.println(x) #define SPLF(x) SPL(F(x))
mils() // ist millis() + sleeped_ms(), da uC regelmäßig im low-Power schläft
Wie ich schon erfahren habe nicht die schönste Methode mit defines zu arbeiten, aber doch Code-Größen neutral im gegensatz zu einer Funktion:
void SP(string x){Serial.print(x)} // das würde so nicht funzzen, müsste wohl sogar ein Template sein!?
Wie ich schon erfahren habe nicht die schönste Methode mit defines zu arbeiten
Das ist eine völlig legitime Verwendung von Makros. Man sollte sie nur nicht da einsetzen wo man auch typ-sichere Konstanten nehmen kann. Also sowas wie "#define VAR 5"
Am einfachsten wäre es, wenn Du den Namen der Funktion zu jedem Pointer abspeicherst, sobald der Pointer gesetzt wird. Das geht recht einfach mit Makros, die sowohl den Namen der ausgewählten Funktion ausgeben als ihn auch in den Code schreiben können. # Operator?