Mutterfunktion herausfinden.

Conners

Erfahrenes Mitglied
Hi, ich hab nen kleines Problem.

Ich hab ne ziemlich große Funktion, die von mehreren Unterprogrammen aus ausgerufen werden kann. Speziell für eine Unterprogramm soll die Funktion etwas ganz bestimmtes machen. Wie kann ich in der Funktion herausfinden, aus welchem Unterprogramm heraus diese aufgerufen wurde. Gibts so eine Möglichkeit?
 
Die einfachste Lösung wäre doch, wenn du der Funkion einfach einen Parameter übergibst, anhanddessen du verstellen kannst, welche Funktion sie aufgerufen hat?
 
hi, soweit hab ich auch schon gedacht :)
an der schnittstelle soll ich nichts ändern, außerdem müsste ich dann headerfiles ändern und neu builden, was ewig dauert!

ich hab mittlerweile ein paar andere externe funktionen inkludiert und ne recht unschöne zustandsabfrage programmiert, die auch funktioniert, allerdings musste ich dafür mehrere headerfiles importieren, und auf unterprogramme zugreifen, auf die ich in der funktion nicht zugreifen wollte.

also wenns keine möglichkeit gibt auf die "aufrufende funktion" zuzugreifen, bleibt mir ja eh nichts anderes übrig als informationen mit zu übergeben oder halt abfragen einzubauen, aber die 1. variante wäre mir persönlich am liebsten.

Gruß Conners
 
Hallo,

was meinst du denn mit "Unterprogramm"?
Evtl. solltest du mal auf einen Debugger zurückgreifen. Der kann dir auch den Funktionsstack ausgeben mit Zeilennummern der Aufrufstellen etc. Das sollte es eigtl. tun.

Gruß,
RedWing
 
mit unterprogramm mein ich eigtl. funktionen ohne rückgabewert, aber ich hab das hier nur geschrieben um zw. der hauptfunktion und den anderen funktionen zu unterscheiden. hatte nix besonderes auf sich.

wie meinst du das mit zeilennummern ausgeben lassen? kann ich im code prüfen ob code aus einer bestimmten zeile ausgeführt wurde oder nicht?
 
RedWing redet vom Debuggen, aber du willst ja das nicht nur beim Debuggen wissen, sondern immer. Wäre es denn nicht besser, du teilst diese eine Funktion in mehrere kleinere Funktionen auf und lässt die der Reihe nach aufrufen? Und nur bei dem einen Fall wird dann eben zwischendrin der Extra-Teil aufgerufen?
 
hi engelmarkus:
ehrlich gesagt kam mir das auch schon in den sinn, allerdings ist die funktion knapp 400 zeilen lang :D

und nur wegen einer klitzekleinen methode, die an einer bestimmten stelle aufgerufen wird, wollt ich nicht einen weiteren parameter in die schnittstelle mit reinbringen und aufteilen wird zu krass!

huhu random-access:
mit überladen meinste doch gleiche funktion auf 2 verschiedenen wegen aufrufen, also mit versch. parameter(n) ?

das würde gehen, ja, aber dann hätt ich ~400 zeilen mehr code...

hmmm, aber ich hab mal ne frage:
kann ich irgendwie global etwas #definen und jederzeit abfragen oder so? ich benutzt #defines nicht oft, aber würde soetwas gehen?

#define check function1()>function2()

und dann im code

if (check){...}
else{...}

geht sowas?
habs schon ausprobiert, aber nicht hingekriegt...aber evtl. nur fehler gemacht beim hinschreiben
 
hi engelmarkus:
ehrlich gesagt kam mir das auch schon in den sinn, allerdings ist die funktion knapp 400 zeilen lang :D

und nur wegen einer klitzekleinen methode, die an einer bestimmten stelle aufgerufen wird, wollt ich nicht einen weiteren parameter in die schnittstelle mit reinbringen und aufteilen wird zu krass!

huhu random-access:
mit überladen meinste doch gleiche funktion auf 2 verschiedenen wegen aufrufen, also mit versch. parameter(n) ?

das würde gehen, ja, aber dann hätt ich ~400 zeilen mehr code...

hmmm, aber ich hab mal ne frage:
kann ich irgendwie global etwas #definen und jederzeit abfragen oder so? ich benutzt #defines nicht oft, aber würde soetwas gehen?

#define check function1()>function2()

und dann im code

if (check){...}
else{...}

geht sowas?
habs schon ausprobiert, aber nicht hingekriegt...aber evtl. nur fehler gemacht beim hinschreiben
Hi Connors,
ein paar Tipps aus meiner Sicht:
1) Wenn deine Funktion abhängig davon ist, woher sie aufgerufen wird: überdenke das Programm-Design.
2) splitte deine Funktion, wie oben schon gesagt.

Das #define ist eine Preprocessor-Direktive.
Code:
#define GUT_DRAUF
...
#ifdef GUT_DRAUF
  function1();
#else
  function2();
#endif
Endweder erhältst du ein EXE, welches immer function1() aufruft, oder immer function2(). Wenn du #define GUT_DRAUF auskommentierst, bekommst du function2().
Während der Laufzeit kannst du nicht verzweigen.
 
Mach es doch einfach mit einem zusätzlichen Parameter, welcher einen Default-Wert besitzt. So musst du nur an der Stelle der Methode was zusätzliches übergeben, wo du es möchtest. Z.B. könntest du den Parameter "bool Spezialisierung=false" nennen.

Gruß Mickeyman.
 
Zurück