Funktioniert bis 255 ms/s/m/h...., danach nicht mehr wie gewünscht.
Ich weiß nicht genau, wie der typedef im Arduino genau angelegt ist. Aber ich gehe mal davon aus, dass es sich hier auch lediglich um ein uint8_t/int8_t handelt.
Somit würde es bei deinem Code einen Überlauf geben. Wenn eine Zahl in C überläuft, dann beginnte diese wieder von vorne. Somit wäre auch die Möglichkeit, das nach 256 (zeiteinheit) die boolean Variable wieder 0 ist.
sschultewolter:
Somit würde es bei deinem Code einen Überlauf geben. Wenn eine Zahl in C überläuft, dann beginnte diese wieder von vorne. Somit wäre auch die Möglichkeit, das nach 256 (zeiteinheit) die boolean Variable wieder 0 ist.
Ein gebräuchlicher Weg (aber nicht so leicht verständlicher Weg) um eine beliebige Zahl auf 0 oder 1 zu kürzen ist so:
bool b = !!integer
Das ist eine doppelte logische Negation. Die erste macht aus einer Zahl > 0 eine 0. Die zweite dann aus der 0 eine 1. Und wenn die Zahl 0 war hat man 0 -> 1 -> 0.
Das stammt aus C wo es anfangs keinen bool Datentyp gab, man sich mit Integern aushalf und TRUE/FALSE nur Makros waren. Aber man sieht es auch heute noch ab und zu.
Wenn man nur ein paar wenige Variablen vom Typ bool verwenden möchte, kann man auch die Headerdatei <stdbool.h> einbinden und sich dann wie gewohnt einen Booltyp anlegen. Variablen dieses Typs brauchen dennoch 1 Byte Speicher, ermöglichen aber eine genaue Unterscheidung zwischen Zahlenvariable und boolscher Variable.
Geht beides. In C++ ist es eigentlich bool. In der Arduino IDE ist boolean ein typedef auf unsigned char (wie früher in C auch, als es noch keinen richtigen boolschen Datentyp gab).
Boolean hat man da vielleicht bevorzugt um ähnlicher zu Processing zu sein, was auf Java basiert, wo es immer boolean heißt.
Die Arduino IDE hatte anfangs bool nicht beim Syntax Highlighting nicht berücksichtigt. Das hat man inzwischen aber glaube ich behoben. Wenn nicht kann man es auch selbst hinzufügen.
Serenifly:
Die Arduino IDE hatte anfangs bool nicht beim Syntax Highlighting nicht berücksichtigt. Das hat man inzwischen aber glaube ich behoben. Wenn nicht kann man es auch selbst hinzufügen.
Also in der 1.05 wird es nicht farbig markiert.
Wie soll man so was hinzufügen?
BTW: Ich bin immer wieder über dein tiefgreifendes Hintergrundwissen fasziniert. Man wenn ich nur einen Bruchteil davon wüsste.... :o
Soll ich jetzt lieber bool nehmen? Oder muss ich meine IDE updaten?
Ich bin mit meiner 1.05 eh irgendwie hinten dran.
Macht es Sinn auf 1.06 umzusteigen oder gleich auf die 1.5x. (auch wenn man aktuell nix mit DUE macht)
Weil boolean sich wie ein Integer verhält. bool ist dagegen ein eigener Datentyp und folgt anderen Regeln. Wenn man einem bool eine Zahl zuweist wird diese automatisch auf 0 und 1 zurechtgestutzt. Bei boolean ist das nicht der Fall.
Das ist nicht gut. Ein expliziter Vergleich von test2 mit true ist da false. Was offensichtlich nicht korrekt ist. Diese Probleme mit unsigned char sind übrigens genau der Grund für das !! Idiom in C. Seit C99 gibt es aber auch da einen richtigen bool Datentyp. Deshalb ist das anachronistisch. Vor allem in C++.
Solange man nichts allzu exotisches macht geht auch boolean. Der Standard Code damit funktioniert damit ja seit Jahren ohne Probleme.
Mit bool kannst du aber das machen:
unsigned long time = ...;
bool request = time;
if(request == true)
{
}
Mit boolean geht das schief!
Das geht dagegen:
unsigned long time = ...;
boolean request = time;
if(request)
{
}
Ich komme aus der Steuerungstechnik, und bin es gewohnt mit rein boolschen Operatoren zu arbeiten.
Da habe ich eigentlich seit ich mit Arduino rumwurschtle einer boolean die "falsche" Bedeutung zukommen lassen. Ihr kommt ja alle aus der C-Ecke und denkt da von Haus aus richtig, aber ich entdecke C erst durch meine Arduino-Projekte.
Beim aktuellen Fall verwende ich es mit dem Befehl digitalWrite. Wobei der eigentlich ziemlich geduldig ist.
Habe in einigen meiner Codes entdeckt, dass ich da nicht LOW oder HIGH (wie in der Reference angegeben) verwende, sondern:
Veröffentlicht ist das noch nicht. Es kommt in der nächsten Version:
Today my GitHub issues were closed and this problem resolved. This fix is part of the core and will be available in version 1.5.9, and possibly 1.0.7.
Mir ist ein Rätsel wieso man das überhaupt jemals so gemacht hat. Selbst wenn man boolean als Schlüsselwort wollte, hatte man wie in der Verbesserung das als typedef auf bool machen können.