Funktionen

Veröffentlicht von

Inhalte

  • Funktionen, um Programmteile zu kapseln
  • Werterückgabe ( return ) bei Funktionen

Einführung

Funktionen werden verwendet um Programmcode zu kapseln, der im Laufe des Programms ein oder mehrmals ausgeführt werden soll. Die Verwendung von Funktionen erhöht die Lesbarkeit von Programmcode und macht diesen in vielen Fällen auch flexibler. Anhand des folgenden Beispiels aus der Lektion if-Bedingung sollen Zweck und Funktionsweise verdeutlicht werden.

Beispiel 1.1

In diesem Code-Beispiel wird in dem if-Block die LED 3-Mal mit 200ms geblinkt, im else  Block die LED einmal kurz geblinkt. Im folgenden Beispiel wird diese Code so umgebaut, dass die Blink-Teile des Codes in eine Funktion „ausgelagert“ werden.

Code-Analyse:

Verglichen mit dem ursprünglichen Code ist nun in der if -Bedingung der Code zum Blinken der LED mit einem Funktionsaufruf ersetzt worden. Die Funktion, die in Zeile 12 aufgerufen wird hat den Namen blinkLong . Man erkennt einen Funktionsaufruf daran, dass auf den Funktionsnamen runde Klammern folgen.

Weiter unten in Zeile 19 wird diese Funktion definiert.

Der Name blinkLong  ist ident mit dem Namen, mit dem die Funktion später aufgerufen wird. Vor dem Namen wird das Schlüsselwort void  (engl. leer) angeführt. Dieses signalisiert, dass diese Funktion keinen Rückgabewert hat (mehr dazu weiter unten). Die runden Klammern bleiben hier leer. Anschließend folgt der Funktionsblock (umschlossen von zwei geschwungenen Klammern). Im Funktionsblock ist derselbe Programmcode zu sehen, der ursprünglich weiter oben im if -Block stand.

Zweck dieses Umbaus war, dass der Programmcode in der Loop-Funktion nun aufgrund der Verkürzung leichter lesbar geworden ist. Die Funktionalität des Blink-Codes wurde in eine Funktion ausgelagert und durch den Aufruf dieser Funktion wird der Code ausführbar.

Beispiel 1.2

Durch die Auslagerung von Code in eine Funktion wurde das Gesamtprogramm modularer. Die Funktion lässt sich jederzeit auch von anderen Orten im Code nur mit der Angabe des Funktionsnamens aufrufen.

Die Funktion an sich ist aber noch sehr unflexibel. Was wäre etwa, wenn die LED nicht dreimal sondern nur zweimal oder sechsmal blinken sollte. Folgende Modifikation ermöglicht dies:

Code Analyse:

Der Funktionskopf wurde um die Variable count  vom Typ int  in den runden Klammern erweitert. Dies signalisiert, dass man beim Aufruf der Funktion einen Integer-Wert an die Funktion übergeben kann. Dieser Wert wird in der Variable count  gespeichert und kann dann bei der Ausführung der Funktion verwendet werden. Hier wird dieser Wert verwendet um die for -Schleife eine bestimmte Anzahl von Malen auszuführen.

Aufgerufen wird diese Funktion nun etwa wiefolgt:

Beim Aufruf der Funktion wird der Wert 6 übergeben, sodass in der Funktion die for -Schleife 6-mal ausgeführt wird.

Beispiel 1.3

Bei der Betrachtung der Funktionen blinkShort  und blinkLong  fällt auf, dass beide Funktionen sehr ähnlich sind. Auch hier bietet sich Potential zur Modularisierung: Beide Funktionen blinken die LED Nummer 13, allerdings mit unterschiedlich langen Zeitdauern. Dies ist nicht sehr elegant, da sich der Code der beiden Funktionen bis auf die Zeitdauer kaum unterscheidet. Im folgenden Beispiel wird die bisher fix vorgegebene Zeitdauer mit einer Variable im Funktionsaufruf ersetzt.

Code Analyse:

Zur besseren Unterscheidbarkeit hat die Funktion nun einen neuen Namen blinkLed  bekommen. Der Funktionskopf wurde um eine Integervariable namens duration erweitert.  Diese gibt im Code weiter unten an, wielange die LED blinken soll.

Aufgerufen muss diese Funktion nun mit zwei Werten oder Variablen werden:

Gesamtbeispiel 1 mit Funktion

Das ursprüngliche Beispiel mit Modifikationen sieht nun wiefolgt aus:

Dieser Code ist sowohl kürzer, als auch modularer und daher flexibler einsetzbar.

Werterückgabe bei Funktionen

An Funktionen können beim Aufruf Werte übergeben werden, andererseits kann sie auch einen Wert zurück an den Aufrufer geben. Kennengelernt haben wir dies implizit bereits beim Aufruf der Funktion digitalRead() .

digitalRead  ist eine Funktion, die mit einem Parameter (der Pin-Nummer) aufgerufen wird und einen Wert (1 bzw. HIGH oder 0 bzw. LOW) zurückgibt. In diesem Fall wird der Wert in der Variable buttonState  gespeichert.

Welchen Typ eine Funktion zurückgibt wird im Funktionskopf definiert:

Die Rückgabe an den Aufrufer erfolgt mittels der Anweisung return . Der Typ des Rückgabewert muss ident mit dem im Funktionskopf angegebenen Typ sein. Anschaulicher wird dies anhand eines Beispiels

Beispiel 2.1

Hier wird eine Funktion definiert, die zwei Integerwerte addiert und mit 2 multipliziert. Das Ergebnis wird mit der return  Anweisung an den Aufrufer zurückgegeben. Im Funktionskopf wird als Rückgabewert der Typ int  definiert.

Die Funktion kann nun z.B. wiefolgt aufgerufen werden. Der retournierte Wert kann etwa in einer Variable gespeichert werden.

void  als Rückgabewert

Soll eine Funktion keinen Wert retournieren, kann als Rückgabewert void  (engl. leer) definiert werden. In diesem Fall benötigt die Funktion nicht zwingend ein return  Statement. Falls es doch benötigt wird, kann dies mit der Angabe von return;  (ohne Wert) geschehen.

Das return -Statement

Das return-Statement bricht die Ausführung einer Funktion auf jeden Fall ab (und gibt je nach Funktionsdefinition einen Wert von einem bestimmten Typ zurück).

Code-Analyse

Die Funktion functionReturn  enthält 3 return-Statements. In der if -Abfrage wird der Parameter vom Typ boolean überprüft und abhänig davon der Wert 1 oder 2 retourniert. Eines dieser beiden return -Statements wird auf jeden Fall ausgeführt, sodass die letzte Zeile der Funktion nie erreicht werden kann.

Zusammenfassung

Funktionen dienen dazu Codeabschnitte wiederverwendbar zu machen. Durch die sinnvolle Anwendung wird der Code dadurch modularer, sauberer und leichter lesbar.

Funktionen können mehrere Werte als Parameter übernehmen und einen Wert retournieren. Das return-Statement bricht die Ausführung einer Funktion ab.

Aufgaben

  • Implementieren Sie Beispiel 1 blind (d.h. versuchen Sie ausgehend von einem nackten Codebeispiel die Funktionalität von Beispiel 1 auszuprogrammieren). Verwenden Sie eine Funktion um die LED blinken zu lassen.
  • Bauen Sie eine Schaltung mit einer LED und zwei Tastern. Taster 1 dient als Zähler.
    • Je nachdem wieoft er gedrückt wird, wird im Progammcode eine Variable erhöht.
    • Wird Taster 2 gedrückt, wird die LED sooft geblinkt, wie vorhin die Taste gedrückt wurde.

Kommentar hinterlassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.