Default zur Angabe eines optionalen Parameters führt zur Zuweisung von "Default"

  • Hallo,
    leider habe ich keine treffendere Überschrift gefunden, hoffe die ist in Ordnung. Was ich damit meine ist folgendes:
    Ich habe gelernt das man default nutzen kann um Parameter zu überspringen wenn diese im Funktionskopf schon vordefiniert sind.
    Dazu folgendes Beispiel:

    [autoit]

    _test(7,default,4)

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

    Func _test($s,$s1=1,$s2=3)
    MsgBox(0,IsString($s1),$s1)
    EndFunc

    [/autoit]
    Zitat

    Ausgabe der MsgBox:0,Default


    Also isString($s1)=False und der Inhalt von $s1 = Default. Mit Stringoperationen lässt sich das default auch "bearbeiten".
    Aber warum ist $s1<>1? Ich habe doch im Funktionskopf die 1 als Defaultwert gesetzt?
    Ist das nicht sogar mit das einzige wofür man Default verwendet? (Habe es bisher noch nicht woanders geshen, zumindest erinnere ich mich nicht)

    In diesem Post wird das Default auch bei einer Funktion genutzt, so wie ich es auch gelernt habe:
    https://autoit.de/index.php?page…ktion#post11816

    Ich nutze Autoit v 3.3.4.0 mein Editor ist Scite V1.78 u. mein OS Win XP SP2

    Gruß
    Dr.Doktor

    Einmal editiert, zuletzt von Dr.Doktor (24. April 2010 um 20:36)

  • mach doch einfach

    [autoit]

    _test(7,default,4)

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

    Func _test($s,$s1=1,$s2=3)
    If $s1 = Default Then $s1 = 1
    MsgBox(0,$s1,$s1) ; Das IsString gibt wegen Default 0 zurück!!
    ; Es müsste also "Default" sein, dann wird aber "Default" eingetragen
    EndFunc

    [/autoit]

    das klappt bei mir (autoit v 3.3.6.1)

  • Hi black_skorpi,
    erstmal danke für deine Antwort.
    Also ist das ein Bug von der Funktion _MySQLConnect() hier:
    http://www.autoitscript.com/forum/index.php?showtopic=20814
    In der Funktion von cdkid steht es so:

    [autoit]

    Func _MySQLConnect($sUsername, $sPassword, $sDatabase, $sServer, $sDriver = "{MySQL ODBC 3.51 Driver}", $iPort=3306)
    Local $v = StringMid($sDriver, 2, StringLen($sDriver) - 2)
    Local $key = "HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI\ODBC Drivers", $val = RegRead($key, $v)
    MsgBox(0,$key,$v)
    If @error or $val = "" Then
    SetError(2)
    Return 0
    EndIf
    $ObjConn = ObjCreate("ADODB.Connection")
    $Objconn.open ("DRIVER=" & $sDriver & ";SERVER=" & $sServer & ";DATABASE=" & $sDatabase & ";UID=" & $sUsername & ";PWD=" & $sPassword & ";PORT="&$iPort)
    If @error Then
    SetError(1)
    Return 0
    Else
    Return $ObjConn
    EndIf
    EndFunc ;==>_MySQLConnect

    [/autoit]


    Folgender Aufruf:

    [autoit]

    _MySQLConnect("User","Pass","database",127.0.0.1,Default,3307)

    [/autoit]


    Angenommen ich möchte der Funktion sagen das der Server nicht wie gewohnt auf dem Port 3306 (Standart für MySQL) lauscht, sondern auf 3307, dann tue ich das ja mit obigem Aufruf. Da ich die Treiberversion nicht ändern möchte da der Defaultwert OK ist nehme ich da ja ein Default, aber nun nimmt er nicht $sDriver = "{MySQL ODBC 3.51 Driver}", sondern $sDriver = Default. Das führt natürlich dazu, dass er den Schlüssel nicht findet und SetError gefolgt von Return ausführt...

    Einmal editiert, zuletzt von Dr.Doktor (24. April 2010 um 20:31)

    • Offizieller Beitrag

    Ich glaube, mit dem Default hast du das völlig falsch verstanden.
    Ein vorbesetzter Parameter wird NICHT standardmäßig verwendet, wenn du dafür "Default" übergibst. Damit das passiert, muß es vom Programmierer in der Funktion abgeprüft werden.

    Zitat von Hilfe

    For UDF's, it is the scripter's responsiblity to check if the parameter has been set to Default and to perform the desired behavior in this situation.

    Default läßt sich wie folgt abfragen:

    [autoit]

    ConsoleWrite(_MyFunc(1,Default) & @CRLF)

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

    Func _MyFunc($a, $b=10, $c=20)
    If IsKeyword($b) Then $b = 10
    Return $a + $b + $c
    EndFunc

    [/autoit]
  • BugFix : Danke für deine Antwort. Also das ist wirklich etwas neues für mich. Bei allen Built-In-Functions hat es bisher funktioniert, von daher ging ich aus, das es quasi zum sauberen coden in Autoit gehört solche Dinge abzufangen. Ist die Einstellung "es sollte der default-Wert abgefangen werden" also gut? Das ich es weiß wenn ich eigene Funktionen schreibe und sie veröffentliche.

    Wäre es nicht besser es so zu fixen:

    [autoit]

    If $sDriver = Default Then
    $sDriver = "{MySQL ODBC 3.51 Driver}"
    EndIf

    [/autoit]


    Weil hier fange ich ja explizit das default ab. Ansonsten werden ja keine Keywords über Funktionen übergeben oder? Wenn das zutrifft würde deine Version nämlich noch die Fälle abfangen wo jemand illegal ein Keyword verwendet, das würde es ein klein wneig praktischer machen, war das die Idee hinter dem isKeyword()?

    Einmal editiert, zuletzt von Dr.Doktor (24. April 2010 um 20:41)

    • Offizieller Beitrag

    Ist die Einstellung "es sollte der default-Wert abgefangen werden" also gut? Das ich es weiß wenn ich eigene Funktionen schreibe und sie veröffentliche.


    Dieser Ansatz ist auf jeden Fall richtig und gehört ja auch zum Errorhandling.
    Ich mache z.B. bei Parametern, die nur 2 Werte annehmen dürfen einen Defaultwert. Wird das Keywort "Default" (oder meist auch noch -1) verwendet, dann erhält der Parameter den Vorgabewert. In allen anderen Fällen wird der zweite mögliche Wert zugewiesen. So kann man auch fehlerhafte Aufrufe abfangen ohne zwingend mit einem Fehler abzubrechen.

    Edit:

    Ansonsten werden ja keine Keywords über Funktionen übergeben oder? Wenn das zutrifft würde deine Version nämlich noch die Fälle abfangen wo jemand illegal ein Keyword verwendet, das würde es ein klein wneig praktischer machen, war das die Idee hinter dem isKeyword()?


    Es gibt bisher nur ein Keyword in AutoIt - "Default" (zumindest habe ich noch nichts Gegenteiliges gehört oder gelesen). ;)

    • Offizieller Beitrag

    Wie nennt man denn dann die ganzen Schlüsselwörter (engl. keywords) in Autoit?


    All die angeführten Schlüsselwörter sind mit Ausnahme von 'Default' nicht allein existent sondern nur innerhalb eines Kontextes. (z.B. 'ContinueLoop' gibt es nur in einer Schleife, andere Schlüsselwörter analog)
    Insofern ist der Funktionsname: IsKeyword auch meiner Meinung nach nicht zutreffend, da nur 'Default' von der Funktion als zutreffend erkannt wird. Eine Umbenennung in IsDefault wurde zwar angeregt aber von den Devs abgelehnt. (Es könnten ja in Zukunft noch mehr Keywords existieren).

  • Die Keywords sind eher Statements. Und als einziges "richtiges" Keyword, ist Default dabei.
    Zumindest wenn ich die Liste mal hiermit durchteste

    [autoit]

    _Test(Default)
    _Test(True)
    _Test(False)
    ;usw.
    Func _Test($sKeyWord)
    Local $sRet = "Nein"
    If IsKeyword($sKeyWord) Then $sRet = "Ja"
    MsgBox(0,"",$sRet)
    EndFunc

    [/autoit]