_Funktionen in Skript suchen...

  • Moin,

    ich bin's nur..., mal wieder mit 'nem Knoten im Hirn.

    Also, ich möchte ein Skript nach allen UDFunktionen durchsuchen und diese angezeigt bekommen.

    Ich bekomme auch etwas zu sehen, nur leider nicht das was ich mir erhoff(t)e...
    Edit: Läuft jetzt soweit, bis auf die kleinigkeit, dass der Rückgabewert von _StringBetween nicht so richtig will...
    Wenn ich FoundFunc[0] benutzen will kommt der Fehler, dass ich mit einer Non-Array Variablen arbeiten will, jedoch lässt sich der Wert nur mit _ArrayDisplay anzeigen, ergo ist es doch ein Array, auch wenn es nur einen Wert enthält, oder ???

    Spoiler anzeigen
    [autoit]


    #include <Array.au3>
    #include <File.au3>
    #include <String.au3>

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

    Dim $ScriptFile, $ArScriptFile, $x
    Dim $ArScriptFileFunktions[1]

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

    $ScriptFile = FileOpenDialog('Select Source Script', @MyDocumentsDir, '(*.au3)', 0, 'Source.au3')

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

    ;Search for _Functions in Source File

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

    If Not _FileReadToArray($ScriptFile, $ArScriptFile) Then
    MsgBox(4096, "Error", 'Es konnte keine Datei eingelesen werden !')
    EndIf

    For $i = 1 To $ArScriptFile[0]
    $ScriptFileFunktion = StringRegExp($ArScriptFile[$i], '[_]' & '[:alpha:]', 1)
    If @extended Then
    $FoundFunc = _StringBetween($ArScriptFile[$i], ' _', '(')
    _ArrayDisplay($FoundFunc) ; Bis hierhin läufts...
    _ArrayAdd($ArScriptFileFunktions, $FoundFunc[0]) ; Hier gibt's einen fetten Error.
    EndIf
    Next

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

    _ArrayDisplay($ArScriptFileFunktions) ; Hier gibt's nur Nullen zu sehen...

    [/autoit]

    Was mache ich denn nun wieder falsch... ? ?(


    Gruß
    Greenhorn

    P.s.: Ist bestimmt wieder nur so ein Dummy-Fehler den ich einfach nicht sehe... !?! X(


    3 Mal editiert, zuletzt von Greenhorn (28. Juni 2007 um 20:09)

    • Offizieller Beitrag

    Hi,

    versuch mal so:

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>

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

    Global $ScriptFile = FileOpenDialog('Select Source Script', 'c:\Downloads\AutoIt-Skripte\Entwicklung\ForumTests\', '(*.au3)', 0, 'Source.au3')

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

    Global $re = _Search_FuncInSource()
    _ArraySort($re)
    _ArrayDisplay($re)

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

    ;Search for _Functions in Source File
    Func _Search_FuncInSource()
    $funcs = StringRegExp(FileRead(FileOpen($ScriptFile, 0)), '_[a-zA-Z0-9]+(?=[ ]*\()', 3)
    Return _ArrayUnique($funcs)
    EndFunc ;==>_Search_FuncInSource

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

    Func _ArrayUnique(ByRef $aArray, $vDelim = '', $iBase = 1, $iUnique = 1)
    If $vDelim = '' Then $vDelim = Chr(01)
    Local $sHold
    For $iCC = $iBase To UBound($aArray) - 1
    If Not StringInStr($vDelim & $sHold, $vDelim & $aArray[$iCC] & $vDelim, $iUnique) Then _
    $sHold &= $aArray[$iCC] & $vDelim
    Next
    Return StringSplit(StringTrimRight($sHold, StringLen($vDelim)), $vDelim)
    EndFunc ;==>_ArrayUnique

    [/autoit]

    Edit: @TO mal getestet?

    So long,

    Mega

  • Hya-Boosa...

    Da hast Du mir aber was hingezaubert =).

    1ooo Dank Mega ! Das sieht schon ganz anders aus, als mein wackeliger Versuch... ;)
    @TO ??? Höre ich zum ersten mal...
    Was ist denn das ?

    Gruß
    Greenhorn

    [Offtopic]
    Hat nicht jemand Lust ein kleines Tutorial über UDFunktionen zu schreiben ?
    Ich meine über Aufbau und Rückgabewerte.
    Das verstehe ich manchmal nicht so recht: Wenn ich Wert(e) in die Klammern einbeziehe, wie muss dann der Rückgabewert sein.
    Oder besser gesagt, die Variablen in den Klammern und die zurückzugebenden Variablen/Werte. Da hakt meine Logik ein bisschen aus..., und die Hilfe bietet nur ein sehr einfaches Beispiel an.
    [/Offtopic]


    2 Mal editiert, zuletzt von Greenhorn (28. Juni 2007 um 20:27)

  • Meinetwegen ich möchte eine Funktion wie _ArrayUnique schreiben...

    Jetzt steht da in den Klammern eine oder mehrere Variablen/Werte.
    Wie baue ich das auf ? Woher weiß ich, dass ich mehrere Optionen in die Klammer schreiben muss und ob es ein integer oder ein string sein muss/soll ?

    Wenn ich mir manchmal UDFs ansehe und sie versuche nachzuvollziehen, dann hakt's aus.
    Mich verwirren auch die Operatoren ByRef und BitOr.
    Wann oder bzw. wofür brauche/benötige ich diese...
    Ich bin mir über den Zweck icht ganz bewusst (Hilfe ist auch etwas sporadisch dazu...)

    Kann ich schwer erklären, aber ich hoffe Du verstehst ungefähr was ich meine... ;)
    Was macht $Delim = '', und was $iBase = 1 usw.


    Gruß
    Greenhorn


    Einmal editiert, zuletzt von Greenhorn (28. Juni 2007 um 20:45)

    • Offizieller Beitrag

    Hi,

    also :

    Du musst dir eine Funktion wie ein gekapseltes Stück Quellcode vorstellen.

    Du übergibst der func Werte mit denen du in der Function arbeiten möchtest.

    Die Typen sind bei autoit eigentlich fast egal.

    ByRef sagt aus, dass die Variable nicht erneut im Speicher kopiert wird, sondern das "Original" übergeben wird.

    Base ist in diesem Fall der Anfangswert innhalb des Arrays.

    So long,

    Mega

  • Um die Katze aus dem Sack zu lassen..., ich möchte einen AutoIt Code Optimizer schreiben, der nur die Funktionen "inkludiert" die im Skript benötigt werden.
    Sollte eigentlich funktionieren, rein theoretisch... ;)

    Ich weiß, AutoIt bringt soetwas bestimmt schon mit, aber ich will es trotzdem tun, weil ich dachte ich lerne dann ein wenig mehr über UDFs und ihren Aufbau...


    Gruß
    Greenhorn

    Edit: Danke dir, so langsam dämmert es mir...


    3 Mal editiert, zuletzt von Greenhorn (28. Juni 2007 um 20:55)