Funktionsparameter (Const, Default) und Enum

  • Hi,

    ich möchte behaupten, dass ich in AutoIt mittlerweile einigermaßen durchblicke. Drei Sachen sind mir jedoch noch nicht ganz klar:
    1. Func...Return...EndFunc:
    Der optionale Const-Parameter für eine übergebene Variable wird so gut wie nie genutzt (zumindest bei Funktionen, die mir bisher untergekommen sind!) Entweder ist mir was entgangen, oder alle anderen benutzen ihn einfach nicht, weil er keinen Geschwindigkeitsvorteil bringt oder... Ja, warum? So wie ich das sehe, sind doch (fast) alle Parameter, die man einer Funktion übergibt konstant, es sei denn man will den Wert einer übergebenen Variable direkt ändern, dann benutzt man halt ByRef.
    Die Hilfe sagt folgendes dazu:

    Code
    The Const keyword is optional and indicates that the value of the parameter will not change during the execution of the function. A variable declared Const can only be passed to a function using a Const parameter.


    2. Default
    Welchen Sinn, macht das Keyword Default? Wenn ich einem Parameter einer Funktion keinen Wert übergeben will, so setze ich ihn im Funktionskopf einfach auf 0 und mache ihn damit optional. Ein standardmäßiges Setzen auf Default, führt ja dazu, dass in der Variablen "Default" steht. Dann müsste ich ja auf "Default" prüfen und die Variable überschreiben, womit sie dann wiederum auch nicht Const sein dürfte. Ich hoffe das Ganze ist noch nachzuvollziehen!
    3. Enum
    Kann mir jemand ein Beispiel für die Anwendung von einem Enum geben (sinnvoll)?

    Hier noch ein wenig Code zur Veranschaulichung:

    Spoiler anzeigen
    [autoit]

    #NoTrayIcon
    Opt("MustDeclareVars", 1)

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

    Local Enum $eiCount0, $eiCount1, $eiCount2
    Local $aiArray[2] = [0, 1]

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

    _TestFunc0($aiArray, Default)
    _TestFunc1($aiArray, Default)

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

    Func _TestFunc0(Const ByRef $avArray, Const $iMODE = 1)
    If $iMODE = 1 Or $iMODE = Default Then
    MsgBox(0, "_TestFunc0", "Hier würde etwas passieren!" & @CR & "$iMODE: " & $iMODE & @CR & _
    "Wenn $iMODE hier gleich 'Default' ist, könnte man nicht mit $iMODE weiter arbeiten!")
    Return (1)
    EndIf
    EndFunc ;==>_TestFunc0

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

    Func _TestFunc1(Const ByRef $avArray, $iMODE = 1)
    If $iMODE = Default Then $iMODE = 1
    If $iMODE = 1 Then
    MsgBox(0, "_TestFunc1", "Hier würde etwas passieren!" & @CR & "$iMode: " & $iMODE)
    Return (1)
    EndIf
    EndFunc ;==>_TestFunc1

    [/autoit]
    • Offizieller Beitrag

    zu 1.
    Die Frage ist, wozu soll ich Variablen als Const deklarieren? - eig. nur, wenn ich garantieren will, dass sie nicht manipuliert werden.
    Solange also meine Programmstruktur dieses sowieso ausschließt, schenke ich mir auch die Deklaration ;)

    zu 2.
    Ich denke, Default dient nur als Vereinfachung für den Funktionsaufruf.
    Man braucht nicht überlegen ob '-1' oder Leerstring sondern setzt einfach Default.

    zu 3.
    Mit Enum kann ich bisher auch nichts anfangen. Aber irgendwo wird sich bestimmt eine sinnvolle Anwendung finden lassen ??

    • Offizieller Beitrag

    Hi,

    1. es sind aus meiner Sicht eher wenig Const Variablen, aber ansonsten siehe Bugfix.

    2. Default ist dazu da, um optionale Parameter einfacher nutzen zu können.
    '', -1, 0, 100 egal bei Default kümmert sich die Funktion darum.

    3. Fällt mir höchstens ein, wenn man z.B. Koordinaten in einer GUI bauen will.

    So long,

    Mega

  • Zu 1. ist vielleicht folgendes zu sagen:

    Wird eine Variable einer Funktion übergeben so wird innerhalb der Funktion eine neue lokale Variable deklariert welche den Wert der übergebenen Variable enthält. (ich weiß - fieser Satz... :evil:).
    Wie bei jeder anderen Variablendeklaration auc,h hat man nun noch die Wahl anzugeben ob diese eine Konstante sein soll oder verändert werden kann.
    Mehr ist das nicht.
    Wird sie als Const deklariert kann sie innerhalb der Funktion nicht mehr verändert werden und behält ihren zugewiesenen Wert bei.
    Ob man nun erst "Const" schreibt oder sowieso im Quelltext die Variable nicht mehr verändert kommt am Ende auf das selbe hinaus - deswegen wird es wohl so selten benutzt.

    ...

    hm nach wirklich aufmerksamen Lesen muss ich feststellen das ich im Grunde einfach nur Bugfix wiederholt habe... :O

    Naja zu 3.:

    Hab ich selbst noch nie benötigt oder gesehen sehe das ganze aber lediglich als eine Möglichkeit der Code-Verkürzung an da man damit bei fortlaufender Wertzuweisung nicht jeden Wert einzeln zuweisen muss.
    Viel Sinn macht es nicht - wird wohl noch ein Relikt aus C sein wo viele Sachen zu finden sind um den Code so klein wie möglich zu machen.

  • Hi, also erstmal danke. Das mit dem Const habe ich mir ja bereits so gedacht, also danke für die Bestätigung!

    Und zu dem "Default". lol...
    Jetzt fällts mir wie Schuppen von den Augen. Macht ja total Sinn. Er nimmt dann also quasi den Wert, der als Standard im Funktionskopf ist. Also quasi wenn ich den dritten Parameter setzen möchte, nicht aber den zweiten, weil er mir Schnuppe ist und ich den Standardwert für ihn verwenden möchte. Leider geht das nicht:

    Spoiler anzeigen
    [autoit]

    Local $aiArray[2] = [0, 1]
    _TestFunc($aiArray, Default, 1)

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

    Func _TestFunc(Const ByRef $avArray, Const $iMODE = 0, Const $iCASE = 0)
    MsgBox(0, "_TestFunc", "$iMODE: " & $iMODE & @CR & "$iCASE: " & $iCASE)
    If $iMODE = 1 Then MsgBox(0, "_TestFunc", "$iMODE is enabled!")
    If $iCASE = 1 Then MsgBox(0, "_TestFunc", "$iCASE is enabled!")
    EndFunc

    [/autoit]


    Es funzt erst, wenn man es so macht. (Was meiner Meinung nach in keinem Verhältnis steht...):

    Spoiler anzeigen
    [autoit]

    Local $aiArray[2] = [0, 1]
    _TestFunc($aiArray, Default, 1)

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

    Func _TestFunc(Const ByRef $avArray, $iMODE = Default, $iCASE = Default)
    If $iMODE = Default Then $iMODE = 0
    If $iCASE = Default Then $iCASE = 0
    MsgBox(0, "_TestFunc", "$iMODE: " & $iMODE & @CR & "$iCASE: " & $iCASE)
    If $iMODE = 1 Then MsgBox(0, "_TestFunc", "$iMODE is enabled!")
    If $iCASE = 1 Then MsgBox(0, "_TestFunc", "$iCASE is enabled!")
    EndFunc

    [/autoit]


    Womit wir wieder bei den Const wären. Das zweite ist garantiert langsamer als das erste (aufgrund der zwei Zuweisungen). Hab ich da jetzt was mit "Default" falsch verstande, oder ist das wirklich so gedacht?

  • Nun, auch wenn dieser Thread bereits seit über 1490 Tage gelöst ist, hier noch ein Hinweis.

    zu 2.
    Sicher ließe sich als optionaler Parameter, jeder beliebige Wert nehmen, doch müsste man sich jedes mal etwas neutrales überlegen. Default ist eine feste Direktive, die als Variableninhalt nicht vorkommt, außerdem durch Autofill schneller zu schreiben ist.

    Besonders Anwendung findet es, denke ich, bei Übergabe von Arrays, die aber optional vordefiniert sein sollen. Da dies im Kopf nicht möglich ist, lässt sich Default gut verwenden. Bei Eintritt in die Funktion kann dann eine Dimensionierung und Initialisierung erfolgen.

    [autoit]


    Func _TEST($size = Default, $Flags=0)
    If $size = Default Then Dim $size[2] = [200,100]

    [/autoit]