INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Multiplikation von Variablen
24.07.2014, 21:14
Beitrag #1
Multiplikation von Variablen
Hallo,

ich habe grade ein seltsames Phänomen bei der Multiplikation festgestellt, für das ich keine Erklärung finde.

Ich möchte einen Timer setzen, indem ich millis() + Wert setze.
Um diesen Wert in Sekunden angeben zu können, wird dieser mit 1000 multipliziert.

??? Wert = 60;
unit32_t Timer = millis() + (Wert * 1000);

Ist der Wert nun vom Variablentyp, der kleiner als das Ergebnis der Multiplikation in der Klammer ist, funktioniert es nicht:

int Wert = 60 funktioniert nicht
unint32_t Wert = 60 funktioniert

Warum?

In Wert wird noch nichts geschrieben ...

Viele Grüße
itsy
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
25.07.2014, 09:47
Beitrag #2
RE: Multiplikation von Variablen
Moin itsy,

wenn du Wert als int deklarierst und mit 1000 multiplizierst geht der Compiler davon aus, dass das Ergebnis auch ein int Wert ist. Da aber 60000 über dem Wertebereich von int liegt gibt es einen Rollover und es kommt was falsches raus.

Generell wird bei solchen Operationen vom Compiler immer der "höherwertige" Datentyp als Ergebnis angenommen, da aber 1000 auch nur ein int -Wert ist, sieht der Compiler keine Veranlassung anzunehmen, dass das Ergebnis größer als der int-Wertebereich ist.

Durch die Deklaration von Wert als uint32_t (long) geht der Compiler von vornherein von einem Ergebnis im Format Long aus, und in dessen Wertebereich passt das Ergebnis rein.

Da die Addition- und Multiplikation als Befehlsfolgen getrennt betrachtet werden, hat die Ausgabe von millis() (ein Longwert) keinen Einfluss auf das Ergebnisformat der Multiplikation.
Hope it helps!

Grüße RK

Nüchtern betrachtet...ist besoffen besser Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
26.07.2014, 10:38
Beitrag #3
RE: Multiplikation von Variablen
Hallo Ricardo,

hab wieder einmal vielen Dank für diese ausführliche Erklärung!

Jetzt weiß ich zumindest, wie ich damit arbeiten muss, damit keine Fehler auftreten (auch wenn es programmtechnisch anders schöner wäre ;-) )

Viele Grüße
itsy
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
01.08.2014, 06:29
Beitrag #4
RE: Multiplikation von Variablen
(26.07.2014 10:38)itsy schrieb:  Jetzt weiß ich zumindest, wie ich damit arbeiten muss, damit keine Fehler auftreten (auch wenn es programmtechnisch anders schöner wäre ;-) )

Der Vollständigkeit halber die schönere Variante:
Code:
int Wert = 60;
unit32_t Timer = millis() + long(Wert * 1000);

oder fast genauso schön:
Code:
int Wert = 60;
unit32_t Timer = millis() + Wert * 1000L;

Gruß lorenz
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
01.08.2014, 07:13
Beitrag #5
RE: Multiplikation von Variablen
Moin,
Zitat:Der Vollständigkeit halber die schönere Variante:
Naja, vielleicht schöner, aber technisch nicht wirklich 100%ig sauber. Warum?
1.)
uint32_t sind ausschließlich positive Zahlen.
Der long()-Cast bzw. die Long-Deklaration mittels "L" beinhaltet jedoch positive und negative Zahlen.
2.)
Code:
int Wert=60;
unit32_t Timer = millis() + long(Wert * 1000);
Dies ist definitv falsch und beachtet genau das nicht, was ich in meinem ersten Post geschrieben habe. Wert * 1000 ergibt 60000. Dies liegt über dem Wertebereich von int. Daher fehlerhaftes Ergebnis, da der Compiler bei zwei int Werten auch ein int Wert als Ergebnis erwartet. Da nützt auch der long()-Cast nix, er wandelt nur das falsche Ergebnis in einen long-Wert um.

Grüße Ricardo

Nüchtern betrachtet...ist besoffen besser Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
01.08.2014, 07:35 (Dieser Beitrag wurde zuletzt bearbeitet: 01.08.2014 07:55 von Corvus.)
Beitrag #6
RE: Multiplikation von Variablen
Bin noch nicht ganz wach, sorry..
Ricardo hat natürlich recht. Darauf wollte ich eigentlich hinaus:
Code:
unit32_t Timer = millis() + (unsigned long) Wert *  1000;

Wobei eine Vorzeichen behaftete Variable kein Problem darstellen sollte, da der Timer Vermutlich keine knappen 70 Jahre laufen soll.

Gruß lorenz
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
01.08.2014, 08:00
Beitrag #7
RE: Multiplikation von Variablen
Moin lorenz,
Zitat:da der Timer Vermutlich keine knappen 70 Jahre laufen soll
Yup, bei dem Beispiel spielt das keine Rolle, Du meinst aber sicher 70 Tage.
Grüße RK

Nüchtern betrachtet...ist besoffen besser Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
01.08.2014, 08:03 (Dieser Beitrag wurde zuletzt bearbeitet: 01.08.2014 08:06 von Bitklopfer.)
Beitrag #8
RE: Multiplikation von Variablen
Moin Gemeinde,
also mal grundsätzlich....wenn ich aus millis() Sekunden haben will dann teile ich durch 1000 und multipliziere nicht und dann nehme ich für das Ergebnis sowieso am besten einen unsigned long int womit ich voll ausm Schneider bin...
Und sollte ich die Zeit in millis() * 1000 benötigen kann man auch einfach den Wert per micros() abfragen Big Grin
Im Fußball heißt das wohl Abseits...Tongue
lg
bk

P.S. in meinem Datenlogger habe ich genau so die Zeit in Sekunden generiert

(01.08.2014 08:00)rkuehle schrieb:  Moin lorenz,
Zitat:da der Timer Vermutlich keine knappen 70 Jahre laufen soll
Yup, bei dem Beispiel spielt das keine Rolle, Du meinst aber sicher 70 Tage.
Grüße RK

Moin,
also so stehts im Reference:
millis()
Description

Returns the number of milliseconds since the Arduino board began running the current program. This number will overflow (go back to zero), after approximately 50 days.
Wink

lg
bk

1+1 = 10 Angel ...und ich bin hier nicht der Suchmaschinen-Ersatz Dodgy...nur mal so als genereller Tipp..
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Variablen over/underflow "deaktivieren" Scheams 6 223 23.06.2016 16:36
Letzter Beitrag: Scheams
Exclamation String Zerlegen in drei Variablen Wampo 4 848 28.12.2015 01:07
Letzter Beitrag: Wampo
  Plausibiltätsprüfung Variablen ??? MaHaI976 10 831 16.10.2015 17:39
Letzter Beitrag: MaHaI976
Information Rechnen mit variablen Jim 3 1.824 22.05.2015 16:44
Letzter Beitrag: Jim
  Variablen Fehler bei TFT Display Xwill 1 806 08.05.2015 13:10
Letzter Beitrag: Thorsten Pferdekämper
  Due: freier Speicher für Variablen während der Laufzeit? HaWe 8 1.394 28.04.2015 08:22
Letzter Beitrag: tito-t
  Variablen per WIFI zwischen 3 Arduinos versenden Daewid 4 793 23.04.2015 01:22
Letzter Beitrag: Daewid
  Variablen Typ double, char, long aus ext. EEPROM lesen SternGucker 8 1.533 02.04.2015 08:10
Letzter Beitrag: SternGucker
  Probleme mit Variablen Johngun 3 629 07.03.2015 02:37
Letzter Beitrag: Johngun
  Probleme mit einer Variablen scritch 12 1.702 05.12.2014 16:56
Letzter Beitrag: Thorsten Pferdekämper

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste