Anfänger Tutorial - Funktionen | Alles was man wissen muss...

  • Anfänger Tutorial - Funktionen


    Vorwort:
    Herzlich willkommen zu meinen Tutorial. Hier wirst du folgendes lernen:
    - Wie man Funktionen deklariert und verwendet
    - Wie man Parameter definiert
    - Wofür die Schlüsselwörter Return, ByRef und Const gut sind

    Zudem habe ich am Ende dieses Tutorials eine PDF Datei angehangen. Das beinhaltet das gesamte Tutorial. Natürlich ist das schöner gestaltet als hier ;)

    1. Funktionen deklarieren und aufrufen:
    Damit wir Funktionen auch definieren können, benötigen wir 2 Befehle.
    - Func | Damit wird angegeben, dass eine Funktion beginnt.
    - EndFunc | Damit wird angegeben, dass eine Funktion beendet wird.

    Zudem benötigen wir auch einen Funktionsnamen. Diesen können wir uns aussuchen. Allerdings gibt es ein paar Sachen zu beachten:
    - Ein Funktionsname darf nicht genau so heißen, wie ein Befehl.
    - Nach dem Funktionsname müssen Klammern gesetzt werden.
    - Ein Funktionsname darf nur folgende Zeichen beinhalten:
    | A-Z | a-z | 0-9 | _ | <<< Der Trennstrich ist ebenfalls nicht zugelassen.

    Hier mal ein paar Beispiele für mögliche Funktionsnamen:
    Falsch: Exit() | Richtig: _Exit() | Der Funktionsname darf ja nicht gleich mit einem Befehl sein.
    Falsch: Äpfel() | Richtig: Aepfel() | Das Zeichen „Ä“ ist nicht zugelassen.
    Falsch: _Funk | Richtig: _Funk() | Hier wurden die Klammern vergessen.

    Nun wollen wir auch eine Funktion deklarieren. Dazu müssen wir erst einmal den Befehl Func aufrufen. Dahinter kommt dann der Funktionsname, dann das Script was ausgeführt werden soll und zu guter Letzt der Befehl EndFunc damit wir alles abschließen können.

    [autoit]

    Func _Funktionsname()
    ;~ Script was ausgeführt werden soll.
    EndFunc

    [/autoit]

    Nun haben wir eine Funktion deklariert. Natürlich fehlt uns jetzt ein Script was gestartet wird, sobald die Funktion aufgerufen wird. Um dies ein wenig abzukürzen nehmen wir eine einfache MsgBox.

    [autoit]

    Func _Funktionsname()
    MsgBox(0, 'Funktion:', 'Hallo aus der Funktion!')
    EndFunc

    [/autoit]

    Jetzt wird es an der Zeit, dass wir unsere Funktion aufrufen. Diese können wir wie ein Befehl nach Belieben aufrufen. Damit das ganze besser zu verstehen ist, habe ich noch eine zweite MsgBox eingebaut.

    [autoit]

    MsgBox(0, 'Script:', 'Hallo aus dem Script!')
    _Funktionsname() ;~ Hier wird die Funktion aufgerufen.

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

    Func _Funktionsname()
    MsgBox(0, 'Funktion:', 'Hallo aus der Funktion!')
    EndFunc

    [/autoit]

    2. Funktionen und deren Parameter:
    Damit wir auch alles verstehen, werden wir in diesem Abschnitt den Befehl MsgBox nachbauen. Dies werden wir aber einfach halten und nur das nötigste schreiben. Wenn du nicht weißt was ein Parameter ist, wird es dir gleich klar werden.

    Als erstes benötigen wir eine Funktion. Wir benutzen mal als Funktionsname _MsgBox. Als Script nehmen wir MsgBox(). Die Klammern lässt du vorerst leer.

    [autoit]

    Func _MsgBox()
    MsgBox()
    EndFunc

    [/autoit]

    Nun überlegen wir mal was wir für unsere MsgBox brauchen. 3 Pflichtangaben und 2 Optionale. Diese Angaben sind übrigens die Parameter. Wir benötigen also:
    - Die Flag Eingabe
    - Den Titel
    - Und die Text Eingabe

    Um die beiden anderen Optionalen Parameter kümmern wir uns später. Nun müssen wir erst einmal Parameter erstellen. Diese können wir einfach in die Klammern schreiben. Wichtig ist aber das diese Variable sind.

    [autoit]

    Func _MsgBox($Flag, $Titel, $Text)
    MsgBox()
    EndFunc

    [/autoit]

    Wichtig ist es auch zu wissen, dass die Parameter gleichzeitig Local in der Funktion definiert werden. Das bedeutet dass diese Variablen nur in der Funktion zur Verfügung stehen. Mit diesem Wissen können wir nun auch die entsprechenden Werte in unsere MsgBox einbauen.

    [autoit]

    Func _MsgBox($Flag, $Titel, $Text)
    MsgBox($Flag, $Titel, $Text)
    EndFunc

    [/autoit]

    Nun können wir wieder unsere Funktion aufrufen, nur dass wir Parameter angeben müssen.

    [autoit]

    _MsgBox(0, 'Funktion:', 'Hallo aus der Funktion!')

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

    Func _MsgBox($Flag, $Titel, $Text)
    MsgBox($Flag, $Titel, $Text)
    EndFunc

    [/autoit]

    Wir haben eine Funktion geschrieben, die 3 Pflichteingaben enthält. Aber wie können wir noch 2 Optionen hinein bauen? Dafür geben wir der Variable direkt beim Deklarieren einen bestimmten Wert. Dieser wird dann immer verwendet, wenn wir den Parameter nicht angeben. Bevor wir aber überhaupt etwas machen, müssen wir und überlegen welche 2 Optionalen Angaben wir noch brauchen und welchen Wert diese zugeteilt bekommen.
    - Wir benötigen noch den Parameter Timeout. Der Standard ist 0, wenn dieser Parameter nicht angegeben wird. Also bekommt unser Script ebenfalls für diesen Parameter den Wert 0.
    - Dann fehlt uns noch das Fensterhandle, kurz: Hwnd. Dieser Parameter hat keinen Standartwert. Zu mindestens wird davon nichts in der Hilfedatei erwähnt. Daher bekommt dieser Parameter einen Leerstring, sprich: ''.

    [autoit]

    Func _MsgBox($Flag, $Titel, $Text, $Timeout = 0, $Hwnd = '')
    MsgBox($Flag, $Titel, $Text, $Timeout, $Hwnd)
    EndFunc

    [/autoit]

    Wir rufen die Funktion 2x auf. Einmal mit dem Parameter $Timeout und einmal ohne. Schließlich wollen wir ja auch sehen ob die Parameter so funktionieren wie wir es wollen.

    [autoit]

    _MsgBox(0, 'Funktion:', 'Hallo aus der Funktion! #1', 2)
    _MsgBox(0, 'Funktion:', 'Hallo aus der Funktion! #2')
    ;~ Die erste MsgBox schließt automatisch nach 2 Sekunden.

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

    Func _MsgBox($Flag, $Titel, $Text, $Timeout = 0, $Hwnd = '')
    MsgBox($Flag, $Titel, $Text, $Timeout, $Hwnd)
    EndFunc

    [/autoit]

    3. Return, ByRef und Const:

    Return:
    Normalerweise ist es so, dass eine Funktion 0 zurückgibt. Aber mit dem Befehl Return kann dieser Wert manuell gesetzt werden. Zudem ist es auch möglich, Zeichenketten als Return Wert zu nehmen.

    Hier ein einfaches Beispiel von einer Funktion, die keinen Return Befehl besitzt:

    [autoit]

    $Ausgabe = _Funktion()
    MsgBox(0, 'Ausgabe:', $Ausgabe)

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

    Func _Funktion()
    $x = 5
    EndFunc

    [/autoit]

    Jetzt könnte man meinen, dass 5 ausgegeben wird. Aber leider ist dies falsch. Damit 5 wirklich ausgegeben werden kann, gibt es 2 Möglichkeiten.

    1. Man gibt $x zurück, also: Return $x
    2. Oder man gibt direkt die 5 zurück, und löscht $x = 5, also: Return 5

    Hier mal das Beispiel für einen Return:

    [autoit]

    $Ausgabe = _Funktion()
    MsgBox(0, 'Ausgabe:', $Ausgabe)

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

    Func _Funktion()
    Return 5
    EndFunc

    [/autoit]

    Statt dem Wert 5 kann auch eine Zeichenkette verwendet werden. Z.B. 'Ausgabe erfolgt!'

    [autoit]


    $Ausgabe = _Funktion()
    MsgBox(0, 'Ausgabe:', $Ausgabe)

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

    Func _Funktion()
    Return 'Ausgabe erfolgt!'
    EndFunc

    [/autoit]

    Und hier noch ein Beispiel, um eine Variable als Return Wert zu nehmen:

    [autoit]


    $Ausgabe = _Funktion()
    MsgBox(0, 'Ausgabe:', $Ausgabe)

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

    Func _Funktion()
    $x = 10
    Return $x
    EndFunc

    [/autoit]

    ByRef:
    Weil es in der Hilfe schon so schön steht, habe ich mir die Beschreibung einfach mal heraus kopiert:

    Zitat

    Das Schlüsselwort ByRef zeigt an, dass der Parameter als Referenz zu dem Originalobjekt behandelt werden soll. Standardmäßig wird der Parameter in eine neue Variable kopiert. Jedoch verknüpft ByRef die neue Variable auf den Originalparameter. [...] Ein Buchstabe kann jedoch nicht als ByRef Parameter übergeben werden.

    Um das zu verstehen, habe ich auch schon ein Beispiel für dich geschrieben. Viel kann ich zu ByRef nicht sagen, allerhöchstens erklären wie es verwendet wird.

    Hier mal ein einfaches Beispiel einer Addition:

    [autoit]


    $a = 2
    $b = 7
    _Summe($a, $b)
    MsgBox(0, 'Ausgabe:', $a)

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

    Func _Summe(ByRef $x, $y)
    $x = $x + $y
    EndFunc

    [/autoit]

    Hier die Erklärung:
    Sobald wir die Funktion _Summe aufrufen, Wird die Variable $x mit $x + $y umgeschrieben. Da wir als Parameter die Variable $a und $b verwendet haben, sieht das ganze so aus:
    $x = 2 ($x also) + 7 ($y also)

    Das bedeutet das $x den Wert 9 enthält. Da wir als Parameter ByRef $x angegeben haben, und unser Parameter Wert $a ist, wird die Variable $x in Variable $a geschrieben. Das bedeutet das die Variable $a ab sofort 9 beinhaltet.

    Nun wird das ganze ausgegeben und fertig ist unsere Addition. Dies funktioniert aber auch mit einer Subtraktion. Ersetz doch mal das Plus durch ein Minus.

    Const:
    Das ist eigentlich schnell erklärt. Mit dem Schlüsselwort Const, wird angegeben dass der Parameter nicht veränderbar ist. Das bedeutet das der Parameter nicht verändert werden kann/darf.

    Hier ein Beispiel Script, dieses gibt allerdings einen Fehler aus:

    [autoit]

    $Ausgabe = _Funktion(10)
    MsgBox(0, 'Ausgabe:', $Ausgabe)

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

    Func _Funktion(Const $Wert)
    $Wert += 1
    Return $Wert
    EndFunc

    [/autoit]

    Schlusswort:
    Wenn es Fragen dazu gibt oder Rechtschreibfehler / Scriptfehler gefunden wurden, so schreibe mir doch ein Kommentar.

    Mfg. Make-Grafik

  • Jo, sehe es :/

    Hab nur hier im Forum danach gesucht :o

    |>> Egal, dann gibt es das jetzt auch hier ^^ aber danke für den Hinweis, werde demnächst darauf achten.

  • BugFix, was du gesagt hast, mag zwar grundsätzlich stimmen, aber es gibt trotzdem verschiedene Arten von Fahrrädern. Mountainbikes und Rennräder z.B., und dabei gibt es dann noch schlechte, kaputte und gut gepflegte, funktionierende Fahrräder. ;)

    Oh Gott, wie sich das anhört. :rofl:

    Naja, was ich eigentlich sagen wollte: Ich seh' das hier trotzdem als Bereicherung für das Forum an. Und wenn Make-Grafik nichts hier im Forum gefunden hat, dann scheint es das nicht im Forum zu geben. Ergo: Wer im Forum danach sucht, hätte ohne das hier nichts gefunden. ;)

    lg chess

    Edit:
    Huch, ich hab' ja das wichtigste vergessen. :S
    @Make-Grafik
    Schönes Tutorial, inhaltlich fallen mir keine Mängel auf.
    Der Pseudocode bei Return ist auch gut. ;)

    Was mir aber aufgefallen ist, dass hin und wieder die Rechtschreibung und Zeichensetzung nicht so ganz richtig ist. ;)
    An sich nicht schlimm, fällt nur unangenehm auf.

    Ach ja, ganz großes Lob dafür, dass du die Schlüsselwörter immer schön eingefärbt hast. :thumbup:

    lg chess


  • Hab nur hier im Forum danach gesucht :o

    Allererste Link links in der Box "Wichtige Links". Bisschen Augen auf dann klappt es auch mit dem Forum...

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Also ich finde das Tutorial recht nützlich. Es kann nie genug Anleitungen geben, die einem den Einstieg in irgendetwas erleichtern. Schön finde ich die Übersicht duch Einfärbung u. Gliederung.
    Allerdings: Wenigstens die Überschrift sollte frei von Rechtschreibfehlern sein. Ansonsten: Toll!

  • OK, das viel mir bei grobem Durchlesen auf:

    Das sollte unklarheiten entfernen
    Funktionen sind recht simple, aber es gibt auch einiges was man da beachten kann/sollte.
    Sicherheits halber habe ich im Nachfolgenden Spoiler alle Zeichen aufgelistet.
    Eine Funktion die definiert wurde, kann wie ein Befehl beliebig aufgerufen werden.
    Diese soll genau das gleiche machen wie MsgBox.
    Jede Variable die sich dort befindet, muss auch besetzt werden.
    Aber noch ganz ist unerse Funktion nicht fertig.
    Das bedeutet das wir diese angeben können, aber nicht müssen.
    Diese wurde bereits schon mit einem leerstring gefüllt.
    Damit wir sehen dass das ganze auch Funktioniert, rufen wir die Funktion 2x auf.
    Dies ist praktisch um Ergebnisse einer Schleife oder einer Mathematischen Aufgabe zurück zu geben.
    Damit wir alle 3 möglichkeiten aufrufen können.
    Mal ein Simples Beispiel einer Addition mit ByRef:
    Natürlich erkläre ich auch wieso das Funktioniert ;)
    Das bedeutet dass wir keinen Return benötigen.
    Da ein potenzieren von 5^1 (als Beispiel) keinen Sinn ergeben würde[...]
    Dies wird nur angegeben, wenn man möchte das dieser Wert sich unter keinen umständen ändert.
    Dann hoffe ich mal dass ich dir das mit den Funktionen näher bringen konnte :D


    Alle Fehler sind unterstrichen.

    Edit: Grr, der Foreneditor mag keine unterstrichenen Leerzeichen...