Funktion mit unbestimmter Anzahl von Parametern

  • Ich möchte in der Funktion der Reihe nach alle im Aufruf angegebenen Parameter auslesen.

    Soo geht es nicht:

    Funktion("Text0", "Text1","Text2")
    Func Funktion($w0="",$w1="",$w2="",$w3="",$w4="",$w5="",$w6="",$w7="",$w8="",$w9="")
    For $i=0 To 9
    Assign("ii", $i)
    $xx="$w"&Eval("ii")
    Protokoll("$xx::"&$xx)
    MsgBox(0,"",$xx)
    If $xx="" Then Exitloop
    Next
    EndFunc

  • AutoIt
    Function("Text0", "Text1", "Text2")
    Func Function($w0 = "", $w1 = "", $w2 = "", $w3 = "", $w4 = "", $w5 = "", $w6 = "", $w7 = "", $w8 = "", $w9 = "")
    	For $i = 0 To 9
    		$xx = Eval("w" & $i)
    		If $xx = "" Then ExitLoop
    ;~ 		Protocol("$xx::"&$xx)
    		ConsoleWrite($xx & @CRLF)
    ;~ 		MsgBox(0,"",$xx)
    	Next
    EndFunc   ;==>Function
  • Code
    Out:
    Func: _Until_10_Param
    $_1: Bla
    $_2: Blub
    $_3: Blob


    EDIT:

    Manche Funktionen gestaltet man ja auch mit einem Leerstring als Vorbelegung für eine Variable, aber es folgen trotzdem noch besetzte Parameter. Deshalb verwende ich für echte leere Variablen die Vorbelegung: NULL.

  • Recht vielen Dank euch beiden.

    Ich werde mich für die Lösung von argumentum entscheiden, weil sie meinen Gedankengängen am ähnlichsten ist. Ich hatte die Wirkungsweise von Eval nicht richtig kapiert.

    Nochmals danke!

  • War auch mein erster Gedanke Velted .
    Bzw. würde ich eine Map nutzen.

    Meine Frage wäre DOheim , warum du überhaupt so eine Funktion hast oder brauchst, mit beliebig vielen Parametern?
    Vielleicht kannst du das ganz vermeiden dann musst du auch nicht mit Eval etc. arbeiten.

    Wenn du mit den angebotenen Lösungen zufrieden bist, ist das auch für mich in Ordnung, doch persönlich würde ich dem "warum" auf den Grund gehen und es gar nicht erst dazu kommen lassen.

    My 13 Cents dazu 😀 .

    Viele Grüße
    Sven

    ------------------------

    Manche Funktionen gestaltet man ja auch mit einem Leerstring als Vorbelegung für eine Variable, aber es folgen trotzdem noch besetzte Parameter. Deshalb verwende ich für echte leere Variablen die Vorbelegung: NULL.

    Finde ich super BugFix , mit NULL zu arbeiten. So initialisiere ich Maps i. d. R. in AutoIt auch, um genau den Leerstring Fall berücksichtigen zu können 🤝 .

  • Als Ergänzung:

    Du kannst auch mit @NumParams die Anzahl der übergebenen Parameter ausgeben lassen.
    Dann ist immer bekannt, ob die Variable übergeben wurde oder nicht, ohne den Inhalt prüfen zu müssen.

    Beliebig viele Parameter werden aber recht selten genutzt (weshalb es in AutoIt auch keine wirkliche Implementierung dafür gibt, ohne Umwege wie Eval zu nutzen).
    Andere Sprachen ermöglichen es z.B., dass der letzte Parameter z.B. als public static void func(String something, String... optional) angegeben wird, wo man beliebig viel übergeben kann und das wird dann in ein Array umgewandelt => String[] optional.
    Es hat aber wenige Anwendungsfälle, die normal auch anders gelöst werden können.

    Schau dir also deinen Anwendungsfall nochmal genau an, ob du das wirklich brauchst. In den meisten Fällen deutet das auf einen Design Fehler in deiner Software Architektur hin :)

    LG, Kanashius

  • Vielleicht hilft Dir "Call" wobei Du die Parameter in einen Array packst und Element 0 des Array den Schlüsselwert "CallArgArray" enthält.
    Details und Beispiel in der Hilfe :)

  • Hmm wieder was gelernt^^ Das @NumParams kannte ich auch noch nicht.

    Aber anstatt X Parameter zu übergeben, würde ich, wenn irgendwie möglich, eher dazu übergehen wenige, dafür z.B. sinnvoll in Array(s) gepackt diese zu übergeben. Aber das hängt wohl auch stark vom Anwendungsfall ab.