Funktionsname ausgeben auf den Funktions-Pointer zeigt?

Hallo,

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.

Vielen Dank!!

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.

avr-objdump -DS DeinProgramm.cpp.elf

Variante 3:
Ein if-else-if oder switch Konstrukt.

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

hi,

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...

gruß stefan

jim_beam:
Pointer to void void FCN

Nürnberger?

"Klassisches" Debugging per log-Ausgabe geht so:

#define DEBUGPRINT(x) Serial.print(x)

void myfunc (int i)
{
   DEBUGPRINT (F("Start myfunc (")); DEBUGPRINT(i); DEBUGPRINT(")\n");
   ...
}

als Beispiel natürlich nur

Edit: Das hat Eisebär schon geschrieben...

hi, michael,

Das hat Eisebär schon geschrieben...

aber ich wußte nicht, daß es klassisch ist. mir erschien's nur logisch... :wink:

gruß stefan

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! :slight_smile:

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!?

guntherb:
Nürnberger?

Nein, aber würden die das so sagen/schreiben? :slight_smile:

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"

Variadische Makros sind hier auch praktisch:
http://forum.arduino.cc/index.php?topic=287398.msg2230426#msg2230426
Da kann man eine beliebige Anzahl an Parametern übergeben. Also z.B. auch Serial.println(var, HEX) mit dem Makro erschlagen

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?

jim_beam:
Nein, aber würden die das so sagen/schreiben? :slight_smile:

Naja, der Nürberger Fußballverein heisst 1. FCN. 8)