Forum: Mikrocontroller und Digitale Elektronik Arduino Code Frage - Variablenzuweisung?


von Josus (Gast)


Angehängte Dateien:

Lesenswert?

hallo,

ich weiss gar nicht ob man mir die Frage so beantworten kann (ohne 
ganzen Code) aber ich frage trotzdem mal. Vorweg: Ich bin ziemlich neu 
in der ganzen Arduino / Arduion-Programmierung Thematik, habe allerdings 
Erfahrung im Umgang allgemeiner Programmiersprachen.

Es geht um die Fragestellung wie Arduino es handhabt wenn man einer 
Variable keinen Wert zugewiesen hat, aber damit rechnen möchte ?

Ich kenne es vom Allgemeinen das dort ein zufälliger Wert (je nachdem 
was dort gespeichert ist) genommen wird.

Im Codebeispiel habe ich die Zeile
1
 if (abs(U_Diode-U_Anzeig)>FlackerGrenze) U_Anzeig=U_Diode;

Dem Wert U_Diode ist etwas zwischen 0 - 1023 zugewiesen (0...5V),
dem Wert U_Anzeig ist allerdings gar nichts zugewiesen! Die Variable 
wird nur ein mal deklariert. FlackerGrenze ist 2 zugewiesen. Wie ist das 
denn nun, wenn ich U_Diode als 1000 annehme (Beispiel) gibt es doch 
mindestens 5 Fälle wo dieses ganze Statement nicht zutreffen wird oder ? 
(998, 999, 1000, 1001, 1002)

Da in diesem Statement U_Anzeig aber endlich einen Wert zugewisen wird 
und man den kurz drunter im If-Statement benutzt gehe ich nicht davon 
aus, dass diesem Wert nichts zugewiesen werden darf oder ? (NC_Grenze 
ist mit 1000 angegeben)
1
 if (U_Anzeig<NC_Grenze)
2
  {
3
4
...


vielen Dank schon mal!

// Bei dem Code handelt es sich um einen fertigen von der PAL. Für die 
Abschlussprüfung Teil 1 Elektroniker für Geräte und Systeme Frühjahr 
2016.

von Robert S. (robert_s68)


Lesenswert?

Arduino sketches sind eigentlich C++. Ob eine Variable vom compiler 
automatisch initialisiert wird hängt vom Datentyp und davon ab wo und 
wie sie deklariert wurde. Initialisiert werden ints und andere PODs nur 
wenn sie static oder global sind, oder Member einer Klasse o.ä.

Berechnungen mit nicht initialisierten Variablen liefern vermutlich 
Unsinn --> nicht machen.

von Erklärbär (Gast)


Lesenswert?

Josus schrieb:
> Es geht um die Fragestellung wie Arduino es handhabt wenn man einer
> Variable keinen Wert zugewiesen hat, aber damit rechnen möchte ?

Arduino handhabt gar nichts denn das ist ein abstraktes, virtuelles
Etwas. "Handhaben" tut der Prozessor auf einem Arduino-Board, und
genau genommen führt der Prozessor verschiedene Register-Operationen,
darunter auch Rechenoperationen aus. Was er operiert oder rechnet
das bestimmt der compilierte Code den der Prozessor vorgelegt bekommt,
und der wiederum stammt aus dem Compiler, in diesem Fall der GCC.

Und was der GCC alles macht (deine Frage im speziellen) um den Prozessor
anzuweisen kann man in seiner (GCC) Dokumentation nachlesen ... da alles
ziemlich streng nach Vorschrieft "gehandhabt" (compiliert) wird kann
man auch in einer C-Bibel nachschlagen.

von Michael U. (amiga)


Lesenswert?

Hallo,

zu C/C++/GCC wurde schon genug gesagt.
Einfache Regel bei mir: keinen Annahmen und Vermutungen. Weise der 
Variablen U_Anzeig bei Programmstart einen sinnvillen Wert zu.

Schau Dir Deine Bedingung an und setze U_Anzeig entweder auf 0 oder auf 
einen Wert höher als das im Ablauf mögliche Maximum. Damit sorgst Du 
dafür, daß beim ersten Auswerten der Bedingung kein Unfug passiert.

Gruß aus Berlin
Michael

von Klaus (Gast)


Lesenswert?

Vielleicht hilft es zunächst, wenn man sich einmal klarmacht wie es zu 
dieser Situation kommt und was sie für Konsequenzen hat. Sie ist nämlich 
an sich nicht ungewöhnlich und man kann daraus für andere Fälle lernen.

Betrachtet man den Zweck dieses Codes, so geht es darum, einen 
Schwellwert für eine Änderung (genauer eine Hysterese) zu 
berücksichtigen. Vermutlich weil gewisse zufällige Änderungen innerhalb 
einer Schwankungsbreite nicht zu vermeiden sind. Auch das ist ein 
häufiger Fall.

Dazu werden zwei zeitlich aufeinander folgende Messungen verglichen.

Nun ist es unvermeidbar, dass beim Start des Programmes eben noch keine 
zwei aufeinander folgende Messungen vorliegen können. Man kann ja 
nicht in die Zukunft sehen.

Man steht also zunächst und vor allem vor dem Problem, dass bei dem 
ersten Mal, bei dem die beiden Werte verglichen werden, einer der beiden 
nicht mit einem realen Wert initialsiert ist und es auch nicht sein 
kann.

Hingegen handelt es sich nicht, wie der Thread-Titel und die näher im 
Text ausgeführte Frage suggeriert, um ein Problem der 
Programmier-Sprache und deren Semantik.

Das muss klar unterschieden werden! (Warum das so ist, führe ich hier 
nicht näher aus).

Es handelt sich um ein Problem des Algorithmus.

Nun denn: Was ist denn nun die Folge dieser Situation?

Nehmen wir zunächst an, dass die zweite - nicht mit einem realen Wert 
initialisierte Variable - mit irgendeinem bestimmten Wert initialisiert 
ist (es spielt zunächst keine Rolle, ob das nun ausdrücklich so im 
Programmtext steht oder sich aus der Sprachdefinition ergibt).
Dann wird der Vergleich beim ersten Mal entweder zutreffen oder nicht.

Wenn er zutrifft (und ich beziehe mich hier auf Deinen konkreten 
Programmtext) denn wird der neue Anzeigewert zwangsweise innerhalb der 
Hysterese liegen und sich daher höchstens um mehr als diese Hysterese 
vom wahren Wert unterscheiden und der Anzeigewert auf den gemessenen 
gesetzt. Wenn er nicht zutrifft, dann unterscheidet sich der "bestimmte" 
Wert mit dem die Variable initialisiert wird, um nicht mehr als den 
Betrag der Hysterese. Der angezeigte Wert stimmt also nicht mit dem 
gemessenen überein, weicht aber auch nicht mehr als beabsichtigt ab.

In beiden Fällen also, wird ein Wert angezeigt, der entweder nicht dem 
realen zuletzt gemessenen entspricht, sich aber höchstens um den Wert 
der Hysterese von dem gemessenen unterscheidet oder eben genau dem 
gemessenen.

Das aber ist ein Verhalten, dass sich nicht von dem unterscheidet, dass 
letztlich gewollt ist. Denn nehmen wir einmal an, dass beide Werte 
tatsächlich gemessen wären, dann würde der angezeigte Wert sich von dem 
aktuell gemessenen wiederum nur um die Hysterese von dem vorherigen Wert 
unterscheiden.

Nimmt man nun - zweitens - an, dass die initialisierung nicht mit einem 
bestimmten, sondern einem zufälligen Wert erfolgt, gilt das eben gesagte 
dennoch. Denn wiederum bewirkt der mögliche Unterschied entweder keine 
Änderung, - dann weicht der angezeigte Wert vom gemessenen um die 
Hysterese ab -, oder er bewirkt eine Änderung die zur Anzeige genau des 
gemessenen Wertes führt.

Egal also, ob ein zufälliger oder bestimmter Wert zur Initialisierung 
gewählt wird: Im Ergebnis entspricht das Verhalten im ersten Schritt dem 
gewünschten.

Man kann allerdings hinzufügen, dass der erste angezeigte Wert, 
statistisch gesehen, je nach Wahl der Initialisierung, von dem wahren 
Mittel abweicht - je nach Verhalten des Signals.

Das aber kann man in Hinblick auf die Frequenz mit der die Anzeige 
aktualisiert wird, betrachten. Erfolgt sie etwa jede Sekunde, so ist der 
angezeigte Werte die erste Sekunde lang - wieder nur statistisch gesehen 
- abweichend vom Mittelwert (oder dem Erwartungswert etc. ich will jetzt 
nicht zu tief in die Statistik eintauchen).

Es gibt allerdings noch eine andere Möglichkeit die formal korrekt ist.
Man zeigt eben nichts an, bis man zwei aufeinander folgende Werte 
gemessen hat. Dann erfolgt der Vergleich definitiv aufgrund zwei 
gemessener Werte.

Wie gezeigt, spielt das aber nur eine Rolle, wenn der angezeigte Wert 
auch keinen falschen statistischen Eindruck (etwa den einer initial 
abnehmenden oder zunehmenden oder gleichbleibenden Tendenz) erwecken 
darf. Ob das hier der Fall ist, müsste man gesondert besprechen, aber 
bei Hobby-Projekten trifft das meist nicht zu.

Ein langer Sermon und vieles Selbstverständliche. Aber vielleicht hilft 
es weiter.

von peter (Gast)


Lesenswert?

Du kannst doch dafür die Optimierungen selber einstellen, ob es weg geht 
beim compilieren oder ob er den leeren Schrott behalten soll.

Gruss

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.