Von welcher Funktion wurde meine Funktion aufgerufen?

  • Hi

    Kann man in einer Funktion herausfinden, von wo aus diese Funktion aufgerufen wurde?

    [autoit]

    _Function()
    _Func()

    [/autoit][autoit][/autoit][autoit]

    Func _Func()
    _Function()
    EndFunc

    [/autoit][autoit][/autoit][autoit]

    Func _Function()
    ConsoleWrite("Parent: ") ;?
    EndFunc

    [/autoit]

    Consolenoutput sollte dann z.b. sein:

    Code
    Parent: Main Script
    Parent: _Func

    bzw. in welcher Ebene man sich gerade befindet?

    Code
    Level: 1
    Level: 2

    Bin für jeden Hinweis dankbar!

  • Spoiler anzeigen

    Gruss Hans-Jürgen ^^

  • Danke, ist jedoch nicht ganz das, was ich wollte.
    Mit Level/Ebene meinte ich nicht die Zeilennummer, sondern die Ebene im Verhältnis zum Mainscript

    In diesem Fall wäre Function in Ebene 2:

    Code
    Main
       |___ Func
              |___ Function

    Des weiteren funktioniert @ScriptLineNumber nicht in kompilierten Scripts

    Edit: Ich habe auch keinen Einfluß auf alle Funktionen, die vorher verschachtelt wurden, da nur die letzte von mir ist (UDF), sonst könnte ich ja einfach jedesmal einen Counter mitgeben...

    E

  • Hi,
    ich löse das Problem in einigen meiner Scripte, indem ich global einen $func_name definiere, der dann z.B. bei Fehlermeldungen abgefragt wird. Funktionen werden ggf zu "Modulen" zusammengefasst. $MODUL ist dann z.B. der Funktionsname.
    Das würde dann z.B. zu einer Fehlermeldung "Fehler in Modul AUSGABE **hier steht dann der Fehlertext**. Das Modul AUSGABE wurde von Modul EINGABE aufgerufen!" führen. Besser als "Error in line -1. AutoIt will be terminated...Press OK to continue"

    Für die "Ebene" (ich gehen von einer Rekursion aus) kann man einen Zähler definieren. Ggf. als STATIC (wird dieses Schlüsselwort eigentlich für die Zukunft unterstützt?).

    EDIT /zu spät....das passiert, wenn man während des postens telefoniert und Kaffee kochen geht^^

  • Oscar ,
    in Rekursionen, um ein Abbruchkriterium zu haben. Eine andere Anwendung fiele mir auch nicht ein

  • Ich hab ehrlich gesagt noch keine eindeutige Verwendung dafür :whistling:

    Sind nur Überlegungen, wie ich in einer UDF die Speicherreservierung besser machen kann.

    Wenn es Macros wie @ParentFuncName oder @RecursionLevel gäbe, dann hätte ich die Möglichkeit meinen Speicher eindeutig zuzuordnen.
    bzw. automatisch freigeben, wenn ich mich nicht mehr in dieser "Position" befinde

    weiß noch nicht, ob das überhaupt Sinn macht - sind halt nur lose Gedanken ;)

    E

  • Verstehe ich ehrlich gesagt nicht. Sobald du eine Funktion verlässt, werden lokale Variablen oder Arrays sowieso gelöscht.
    Solltest du in einer Rekursion stecken, dann ist es natürlich tödlich (Speichertechnisch gesehen) die Funktion abzubrechen, statt mittels der Abbruchbedingung die Rekursion "rückwärts" abzuarbeiten. Beim "rauslaufen" aus einer Rekursion wird der (von der Funktion bei jedem Aufruf der Funktion reservierte) Speicher sowieso wieder freigegeben.

  • Erstmal Servus, da es hier mein erster Beitrag ist. ;)

    Ich habe vor kurzem nach einer ähnlichen Möglichkeit gesucht, da ich gerne in der Ausgabe von "_FileWriteLog" auch die aktuell genutzte Funktion mit eingebunden hätte, welches das Auswerten des Logs später erleichtert.

  • hmmmm, wäre das nicht ein Feature , welches man in "Organize Includes" unterbringen könnte? Im Prinzip hat OI schon 90% der Arbeit erledigt...
    Mach doch eine UDF, welche im aufgerufenen Script an den passenden Stellen die Variablen $ParentFuncName und $CurrentFuncName einfügt :)

  • Sowas in der Art?

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    _Funktion2("Test")
    _Funktionnummer3()
    _Funktion1()

    [/autoit] [autoit][/autoit] [autoit]

    Func _Funktion1($iSLN = @ScriptLineNumber)
    _Funktion2("Hallo!")
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _Funktionnummer3($Parameter1="Def",$Param2="Test",$iSLN = @ScriptLineNumber)
    _Funktion2("Testen wir mal!")
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _Funktion2($iParameter, $iSLN = @ScriptLineNumber)
    MsgBox(0,"","Aufgerufen von: "&_GetParentFunktion($iSLN))
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _GetParentFunktion($iSLN)
    If @Compiled Then Return "Unable to retrieve information when Script is compiled"
    $aFunc = StringRegExp(FileRead(@ScriptFullPath),'(?m)\A(?>.*\r\n){1,'&$iSLN&'}Func (\w+)\(.*\)',1)
    If @error Then Return "MainScript"
    Return $aFunc[0]
    EndFunc

    [/autoit]

    Funktioniert halt nur uncompiled.