Hier werden die Unterschiede zwischen zwei Versionen gezeigt.
Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
einleitung:methoden [2013/09/20 11:25] 127.0.0.1 Externe Bearbeitung |
einleitung:methoden [2016/01/21 12:45] (aktuell) |
||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
- | ===== Methoden ===== | + | ====== Funktionen: Programmcode hübsch als Baustein verpackt====== |
+ | Sobald euer Programm eine gewisse Größe erreicht, wird es schnell unübersichtlich. Außerdem werdet ihr bemerken, dass ihr bestimmte Teile eures Codes immer wieder verwendet, so dass ein großer Teil eures Programms aus redundantem Copy&Paste besteht. | ||
+ | |||
+ | Ein typisches Beispiel dafür wäre z.B. ein Programmteil, der dafür sorgt, dass der Roboter eine bestimmte Strecke nach vorne fährt. | ||
+ | |||
+ | Was liegt also näher, als diese Teile eures Programms in wiederverwendbaren Modulen zu verpacken, die ihr immer dort, wo ihr sie braucht, mit einem einzelnen Wort aufrufen könnt? | ||
+ | |||
+ | Genau dabei helfen euch **//Funktionen//**. | ||
+ | |||
+ | Funktionen sind kleine "Unterprogramme". Sie können (optional) Eingabedaten entgegennehmen ("Parameter"), in einem Programmabschnitt etwas damit machen, und dann (optional) ein Ergebnis an den Programmteil, der sie aufgerufen hat, zurückgeben ("Rückgabewert"). | ||
+ | |||
+ | Auch die meisten Befehle von Arduino sind als Funktionen programmiert - so z.B. ''analogRead'', ''digitalWrite'' usw. | ||
+ | |||
+ | ==== Syntax: Wie baue ich mir eine eigene Funktion ==== | ||
+ | Um eine Funktion zu erstellen, müsst ihr sie in eurem Programm "deklarieren". Die Deklaration enthält folgende Angaben: | ||
+ | * Einem //**Namen**//, unter dem ihr die Funktion aufrufen könnt (vor den Runden Klammern) | ||
+ | * Optional //**Parameter**//, die ihnen beim Aufruf übergeben werden. (in den runden Klammern | ||
+ | * Einen //**Rückgabetypen**//, also eine Angabe darüber, was für einen Variablentypen das "Ergebnis" der Funktion hat (wenn nichts zurückgegeben wird, steht da ''void'' | ||
+ | * Einen Codeabschnitt "**//Body//**", der ausgeführt wird, wenn die Funktion aufgerufen wird. | ||
+ | |||
+ | Das Ganze sieht dann in etwa so aus: | ||
+ | <code c++> | ||
+ | rückgabeTyp funktionsName(parameter1Typ parameter1Name, ...){ | ||
+ | code; | ||
+ | } | ||
+ | </code> | ||
+ | Falls ihr euch wundert: Ja - auch "setup" und "loop" sind Funktionen... | ||
+ | |||
+ | === Beispielfunktion: Blink mir ein "S" === | ||
+ | Hier ein Beispiel für eine Funktion, die ein "S" auf der LED morst, wenn sie aufgerufen wird. | ||
+ | Sie braucht dafür keine Parameter und Rückgabe. | ||
+ | <code c++> | ||
+ | void setup(){ | ||
+ | pinMode (13, OUTPUT); // schalte den LED-Pin auf "Ausgang" | ||
+ | } | ||
+ | |||
+ | void loop(){ | ||
+ | morseS(); // rufe die Funktion "morseS" auf. | ||
+ | delay(1000); //warte etwas | ||
+ | } | ||
+ | |||
+ | // Hier versprochene die Funktion: | ||
+ | // Die Funktion gibt nichts zurück (deshalb "void") | ||
+ | // Die Funktion hat den Namen "morseS" | ||
+ | // die Funktion hat keine Parameter (deshalb nichts in den Klammern) | ||
+ | void morseS(){ | ||
+ | //die Funktion macht dreimal kurz das Licht an, wenn sie aufgerufen wird. | ||
+ | digitalWrite(13,HIGH); | ||
+ | delay(200); | ||
+ | digitalWrite(13,LOW); | ||
+ | delay(200); | ||
+ | |||
+ | digitalWrite(13,HIGH); | ||
+ | delay(200); | ||
+ | digitalWrite(13,LOW); | ||
+ | delay(200); | ||
+ | |||
+ | digitalWrite(13,HIGH); | ||
+ | delay(200); | ||
+ | digitalWrite(13,LOW); | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | ==== Mehr Flexibilität durch Parameter ==== | ||
+ | Etwas mehr Flexibiliät gewinnen wir, wenn wir die Funktion so schreiben, dass sie den Pin und die Geschwindigkeit als Parameter entgegen nimmt. | ||
+ | |||
+ | Dazu Schreiben wir diese beiden **//Parameter mit ihren Typen in die runden Klammern//** der Funktionsdeklaration, so wie wenn wir eine Variable deklarieren würden. | ||
+ | == Beispielcode: Blink mir ein "S" auf einem beliebigen Pin mit einer festgelegten Geschwindigkeit == | ||
+ | <code c++> | ||
+ | ... | ||
+ | |||
+ | // neu: die parameter "zeit" und "pin" | ||
+ | void morseS(int pin, int zeit){ | ||
+ | //In diesem Programmteil sind die beiden Parameter als Variablen verfügbar. | ||
+ | digitalWrite(pin, HIGH); | ||
+ | delay(zeit); | ||
+ | ... | ||
+ | } | ||
+ | ... | ||
+ | </code> | ||
+ | |||
+ | Die Werte, die in die Variablen eingesetzt (//**übergeben**//) werden sollen, werden beim Aufruf in die Klammern hineingeschrieben. Das Programm erkennt an der **//Reihenfolge//**, mit der sie in den Klammern stehen, welcher Wert in welche Variable soll: | ||
+ | <code c++> | ||
+ | ... | ||
+ | void loop(){ | ||
+ | morseS(10, 250); // Blinke diesmal auf Pin 10 und etwas langsamer... | ||
+ | } | ||
+ | ... | ||
+ | </code> | ||
+ | |||
+ | ==== Informationen als Rückgabewert liefern ==== | ||
+ | In vielen Fällen wollen wir, dass ein wiederverwendbarer Programmteil | ||
+ | |||
+ | ==== Weitere Vorteile von Funktionen ==== | ||
+ | |||
+ | |||
Wenn in der Informatik bestimmte Abschnitte an verschiedenen Stellen gleich sind, werden sie oft in Methoden ausgelagert, damit das Programm übersichtlicher bleibt. Diese Methoden können dann an diesen Stellen aufgerufen werden.\\ | Wenn in der Informatik bestimmte Abschnitte an verschiedenen Stellen gleich sind, werden sie oft in Methoden ausgelagert, damit das Programm übersichtlicher bleibt. Diese Methoden können dann an diesen Stellen aufgerufen werden.\\ | ||
Außerdem hat man die Möglichkeit einer Methode Werte in Form von sogenannten Parametern zu übergeben. Diese können dann in der Methode verwendet werden. Auch kann die Methode etwas zurück geben, diese Werte heißen dann Rückgabewerte.\\ | Außerdem hat man die Möglichkeit einer Methode Werte in Form von sogenannten Parametern zu übergeben. Diese können dann in der Methode verwendet werden. Auch kann die Methode etwas zurück geben, diese Werte heißen dann Rückgabewerte.\\ |