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
Variablen over/underflow "deaktivieren"
22.06.2016, 02:07
Beitrag #1
Variablen over/underflow "deaktivieren"
Hallo!

Wie wäre es am einfachsten Over- und Underflows zu "deaktivieren"?
Ja - man könnte jedes mal mit if oder ?-Operator überprüfen auf over-/underflows. Ist aber warscheinlich nicht sehr effektiv und unschön zum lesen.
Hier ein Beispiel wie ichs nicht haben möchte (foo()) und wie ich es haben will (bar()):
Code:
// mit over/underflow (unerwünscht)
void foo()
{
  unsigned char pwm = 255;
  pwm = pwm + 30; // wird zu 29
  pwm = pwm - 40; // wird zu 245
  analogWrite(6, pwm + 80); // analogWrite(69)
}

// ohne over/underflow (erwünscht)
void bar()
{
  unsigned char pwm = 255;
  pwm = pwm + 30; // bleibt 255
  pwm = pwm - 40; // wird zu 215
  analogWrite(6, pwm + 80); // analogWrite(255)
}

mfg Scheams
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
22.06.2016, 10:50
Beitrag #2
RE: Variablen over/underflow "deaktivieren"
Hallo,
wenn mich nicht alles täuscht, dann entscheidet das der Prozzesor. Der setzt
ein Überlauf-Bit und nichts geht mehr.
Ich weiß nicht, ob man das mit ArduinoMitteln abschalten kann. Frage mal die
Atmel-Jünger.
Kannst Du Deine Zahlen nicht mit einem anderen WerteBereich deklarieren?
Gruß und Spaß
Andreas
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
22.06.2016, 13:21
Beitrag #3
RE: Variablen over/underflow "deaktivieren"
Interessante Geschichte! Kompliment!

Aber wie will man das regeln?

Meine erste Idee:
(Ich bin grad im SPS Fieber, darum ist mir die Syntax grad nicht geläufig)

Eine Funktion bauen, mit 5 Eingängen plus Ergebnisrückgabe.
Wert 1, Wert 2, Byte für 4 Grundrechenarten Wert min, Wert Max

In der Funktion dann alles auf größten Wertebereich bringen.
Je nach Anforderung die Rechenart durchführen
Abfrage min/Max überschritten?
Ja: Ausgangswert mit min oder Max belegen
Nein: Ausgangswert mit Rechenergebnis belegen


Aber ob das dann im Programm einfacher wird?!

Binatone
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
22.06.2016, 19:31
Beitrag #4
RE: Variablen over/underflow "deaktivieren"
Hey!

(22.06.2016 10:50)SkobyMobil schrieb:  ...
Kannst Du Deine Zahlen nicht mit einem anderen WerteBereich deklarieren?
...
Würde prinzipiell funktionieren, aber ich bevorzuge es nur den benötigten Bereich freizugeben. So verwende ich ein unsigned char wenn nur die Werte 0-255 gebraucht werden etc.

Ich auch schon Überlegungen:
- Evtl. eine bitweise Rechnung basteln die over- und underflows "filtert"?
- Eigene Klassen (in C++) erstellen mit class-Operatoren die zusätzlich Werte begrenzen (in etwa das selbe wie mit einer Funktion).

Mir scheinen die Lösungen aber nicht wirklich gut, da sie 1. den Ablauf von Rechnungen verlängern und 2. warscheinlich nicht gerade kompatibel sind (neue Klassen in einer Library).

mfg Scheams
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
22.06.2016, 23:07
Beitrag #5
RE: Variablen over/underflow "deaktivieren"
(22.06.2016 19:31)Scheams schrieb:  Hey!

(22.06.2016 10:50)SkobyMobil schrieb:  ...
Kannst Du Deine Zahlen nicht mit einem anderen WerteBereich deklarieren?
...
Würde prinzipiell funktionieren, aber ich bevorzuge es nur den benötigten Bereich freizugeben. So verwende ich ein unsigned char wenn nur die Werte 0-255 gebraucht werden etc.

Ich auch schon Überlegungen:
- Evtl. eine bitweise Rechnung basteln die over- und underflows "filtert"?
- Eigene Klassen (in C++) erstellen mit class-Operatoren die zusätzlich Werte begrenzen (in etwa das selbe wie mit einer Funktion).

Mir scheinen die Lösungen aber nicht wirklich gut, da sie 1. den Ablauf von Rechnungen verlängern und 2. warscheinlich nicht gerade kompatibel sind (neue Klassen in einer Library).

mfg Scheams

also ich habe das jetzt nicht nachgeprüft aber ich vermute, dass
analogWrite (int, int); so deklariert ist.

allein mit diesem aufruf "analogWrite(6, pwm + 80);" setzt du also automatische typumwandlungen in gang die dein ergebnis verfälschen.
Ich bin zwar auch dafür Speicher spartanisch zu verwenden aber ich denke @SkobyMobil hat da absolut recht. ein unsigned char ist in dem fall eine suboptimale lösung.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
23.06.2016, 03:12
Beitrag #6
RE: Variablen over/underflow "deaktivieren"
Moin,
als Vorschlag constrain() ? Siehe: https://www.arduino.cc/en/Reference/Constrain
Grüße Ricardo

Nüchtern betrachtet...ist besoffen besser Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
23.06.2016, 16:36 (Dieser Beitrag wurde zuletzt bearbeitet: 23.06.2016 16:37 von Scheams.)
Beitrag #7
RE: Variablen over/underflow "deaktivieren"
Hey!

(22.06.2016 23:07)Pit schrieb:  ...
also ich habe das jetzt nicht nachgeprüft aber ich vermute, dass
analogWrite (int, int); so deklariert ist.

allein mit diesem aufruf "analogWrite(6, pwm + 80);" setzt du also automatische typumwandlungen in gang die dein ergebnis verfälschen.
Ich bin zwar auch dafür Speicher spartanisch zu verwenden aber ich denke @SkobyMobil hat da absolut recht. ein unsigned char ist in dem fall eine suboptimale lösung.

analogWrite() ist mit (uint8_t, int) deklariert, also der PWM-Wert in int. Ok also wird der Wert in 16bit übergeben, danach findet aber keine Begrenzung statt und der int-Wert wird in ein 8-bit Register geschrieben (z.B. OCR0A) und hier findet widerum der overflow statt. Also ändert die Übergabe eines Integers nichts. Man könnte natürlich davor den Wert begrenzen.
Da man also die Funktion konfigurieren könnte, wäre ein int ausreichend und ich stimme dir zu, dass ein uint8_t eine suboptimale Lösung ist.
Aber ich würde in meinem Programm kein analogWrite() verwenden, sondern nurnoch auf das Register schreiben (davor natürlich mit ensprechender eigener Timer-Initialisierung) d.h. im Code steht dann nurnoch "OCRxn = value" und hier würde sich das deaktivieren von Overflows perfekt eignen, ansonsten muss ich den Wert wieder begrenzen.

(23.06.2016 03:12)rkuehle schrieb:  Moin,
als Vorschlag constrain() ? Siehe: https://www.arduino.cc/en/Reference/Constrain
Grüße Ricardo
Würde auch funktionieren, aber wenn ich keinen Overflow prinzipiell in meinem gesamten Programm haben will, ist es etwas umständlich das an jeder Variable und Rechenoperation anzuwenden.

mfg Scheams Smile
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
Exclamation String Zerlegen in drei Variablen Wampo 4 852 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.827 22.05.2015 16:44
Letzter Beitrag: Jim
  Variablen Fehler bei TFT Display Xwill 1 808 08.05.2015 13:10
Letzter Beitrag: Thorsten Pferdekämper
  Due: freier Speicher für Variablen während der Laufzeit? HaWe 8 1.396 28.04.2015 08:22
Letzter Beitrag: tito-t
  Variablen per WIFI zwischen 3 Arduinos versenden Daewid 4 795 23.04.2015 01:22
Letzter Beitrag: Daewid
  Variablen Typ double, char, long aus ext. EEPROM lesen SternGucker 8 1.538 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.704 05.12.2014 16:56
Letzter Beitrag: Thorsten Pferdekämper
  Berechnung in einer Variablen scritch 8 2.038 04.10.2014 19:04
Letzter Beitrag: Bitklopfer

Gehe zu:


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