Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
faecher:nwt:arduino:lernbaustein2:funktionen2:start [11.02.2025 20:15] – [Lokale und globale Variablen] sbel | faecher:nwt:arduino:lernbaustein2:funktionen2:start [11.02.2025 21:07] (aktuell) – sbel | ||
---|---|---|---|
Zeile 136: | Zeile 136: | ||
</ | </ | ||
+ | ---- | ||
+ | {{: | ||
+ | === (A4) === | ||
+ | * Erkläre, warum sich das Programm so verhält. | ||
+ | * Übernehme die Änderungen in deinen Sketch und teste. | ||
+ | * Ändere den Wert von '' | ||
+ | * Kommentiere die beiden Variablendeklarationen am Beginn des Sketsches aus und teste, was jetzt passiert. | ||
+ | |||
+ | |||
+ | <callout type=" | ||
+ | Variablen, die am Beginn eines Arduino Sketches deklariert werden, sind **global** gültig: Man kann in allen Funktionen auf sie zugreifen. | ||
+ | |||
+ | Allerdings kann man sie auch überall verändern. Bei längeren Programmen ist es darum oft nicht immer einfach zu wissen, was für einen Wert eine globale Variable gerade hat. | ||
+ | |||
+ | Man sollte die Verwendung von globalen Variablen darum auf wenige Zwecke einschränken, | ||
+ | </ | ||
+ | |||
+ | Man kann den Sketch wie folgt abändern, um lokale Variablen zu erhalten: | ||
+ | |||
+ | <code c> | ||
+ | void setup() { | ||
+ | delay(1000); | ||
+ | Serial.begin(9600); | ||
+ | delay(1000); | ||
+ | Serial.println(" | ||
+ | quadratzahlen(); | ||
+ | Serial.println(" | ||
+ | quadratzahlen(); | ||
+ | Serial.println(" | ||
+ | } | ||
+ | |||
+ | void quadratzahlen() { | ||
+ | // Lokale Variablen | ||
+ | int start=1; | ||
+ | int ende=5; | ||
+ | Serial.print(" | ||
+ | for(int i=start; i<ende; i++) { | ||
+ | int q=i*i; | ||
+ | Serial.print(q); | ||
+ | Serial.print(" | ||
+ | } | ||
+ | Serial.println(" | ||
+ | return; //Optional, weil kein Wert zurückgegeben wird. | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | <callout type=" | ||
+ | Variablen, die innerhalb eines Codeblocks mit geschweiften Klammern deklariert werden, gelten nur **lokal** innerhalb dieses Klammerblocks. Außerhalb des Klammerblocks kann nicht auf sie zugegriffen werden. | ||
+ | |||
+ | * Parameter einer Funktion sind immer lokale Variablen in der betreffenden Funktion. | ||
+ | * Laufvariablen von for-Schleifen sind lokal innerhalb des Schleifenblocks | ||
+ | </ | ||
+ | |||
+ | |||
+ | ---- | ||
+ | {{: | ||
+ | === (A5) === | ||
+ | |||
+ | Ändere deinen Sketch so ab, dass lokale Variablen verwendet werden. Versuche die Variable '' | ||
+ | |||
+ | ==== Was ist, wenn es globale und lokale Variablen mit gleichem Namen gibt? ==== | ||
+ | |||
+ | Betrachte den folgenden Sketch: | ||
+ | |||
+ | <code c> | ||
+ | int start=2; | ||
+ | void setup() { | ||
+ | delay(1000); | ||
+ | Serial.begin(9600); | ||
+ | delay(1000); | ||
+ | Serial.println(" | ||
+ | quadratzahlen(); | ||
+ | Serial.println(" | ||
+ | quadratzahlen(); | ||
+ | Serial.println(" | ||
+ | } | ||
+ | |||
+ | void quadratzahlen() { | ||
+ | // Lokale Variablen | ||
+ | int start=1; | ||
+ | int ende=5; | ||
+ | Serial.print(" | ||
+ | for(int i=start; i<ende; i++) { | ||
+ | int q=i*i; | ||
+ | Serial.print(q); | ||
+ | Serial.print(" | ||
+ | } | ||
+ | Serial.println(" | ||
+ | return; //Optional, weil kein Wert zurückgegeben wird. | ||
+ | } | ||
+ | |||
+ | </ | ||
+ | |||
+ | Hier gibt es sowohl eine globale als auch eine lokale Variable mit dem Namen '' | ||
+ | |||
+ | ---- | ||
+ | {{: | ||
+ | === (A6) === | ||
+ | |||
+ | * Teste den Sketch. Welche Variable wird in der for-Schleife verwendet? | ||
+ | * Gib den Wert von '' | ||
+ | |||
+ | |||
+ | ===== Funktionen mit Rückgabewert ===== | ||
+ | Funktionen können, wenn sie zu der Stelle zurückkehren, | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | <code c> | ||
+ | void setup() { | ||
+ | delay(1000); | ||
+ | Serial.begin(9600); | ||
+ | delay(1000); | ||
+ | Serial.println(" | ||
+ | double n = nullstelle(-2, | ||
+ | Serial.print(" | ||
+ | Serial.println(n); | ||
+ | Serial.println(" | ||
+ | } | ||
+ | |||
+ | double nullstelle(double steigung, double yachsabsch) { | ||
+ | double nullst = -1 * yachsabsch / steigung; | ||
+ | return nullst; | ||
+ | } | ||
+ | |||
+ | void loop() { | ||
+ | // Leer - der Loop hat hier keine Funktion | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | ---- | ||
+ | {{: | ||
+ | === (A7) === | ||
+ | |||
+ | * Was berechnet der abgebildete Sketch? Teste mit verschiedenen Parameterwerten. | ||
+ | * Erweitere den Aufruf der Funktion im Setup so, dass alle Nullstellen aller Geraden mit Steigungen zwischen -2.0 und -1.0 mit der Schrittweite 0.1 berechnet werden: {{ : | ||
+ | |||
+ | ++++ Hilfestellung 1: For Schleife mit 0.1er Schritten | | ||
+ | |||
+ | Die for-Schleife sieht hier z.B. so aus: | ||
+ | <code c> | ||
+ | for (double i = -2; i <= -0.99; i = i + 0.1) { | ||
+ | // Rechnen und ausgeben | ||
+ | } | ||
+ | </ | ||
+ | ++++ | ||
+ | |||
+ | ++++ Lösungsvorschlag | | ||
+ | <code c> | ||
+ | for (double i = -2; i <= -0.99; i = i + 0.1) { | ||
+ | double n = nullstelle(i, | ||
+ | Serial.print(" | ||
+ | Serial.print(i); | ||
+ | Serial.print(" | ||
+ | Serial.println(n); | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | ++++ |