Boolean <-> INT Zuweisung

Hi,

wieder mal eine Anfängerfrage von mir :slight_smile:
Codeoptimierung:

Wenn ich so was habe:

int time;
boolean request;
    if (time >0) {
      request = true;
      }
      else {
        request = false;
      }

Das kann man doch sicher kürzer schreiben.

Ich hätte mal so was probiert?

 request = time;

Der Compiler meckert zwar nicht, aber irgendwie läuft dann mein Programm nicht mehr ......

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.

weil ein boolean 8 bit adressraum braucht?

einfache Lösung wäre so:

bool request = (time > 0);

hk007:
weil ein boolean 8 bit adressraum braucht?

Da bin ich mir nicht ganz sicher. Ich habe keine bool/boolean in Gebrauch. Die Lösung von MGOS geht, da der Vergleichsoperator nur 2 Zustände kennt.

Ein gebräuchlicher Weg um eine Zah

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.

hi,

weil ein boolean 8 bit adressraum braucht?

ja, ist halt so.

gruß stefan

Hi,

danke für eure Antworten.
Ich fass mal zusammen:

request = (time > 0);
request = !!time;

Wenn beide möglich sind, dann gefällt mir die erste Variante besser -> Ich kann dann meinen Code in einem Monat auch noch verstehen.

Wie gesagt das ist etwas veraltet und in der Tat unleserlich. Hier würde ich es auch nicht wirklich empfehlen.

Boolean --- 8Bit --- Adressraum?
Da wird irgend ein Wort falsch benutzt!

Ja.

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.

http://de.wikibooks.org/wiki/C-Programmierung_mit_AVR-GCC/_Datentypen

Es würde aber auch unterandern gehen, dass man sich einen Byte mit bis zu 8 Statusvariablen anlegt, und dann nur die einzelnen Bits abfragt.

Ich würde auch bool request = (time > 0); schreiben. !!time ist eher was für Code Golf .

Noch mal nachgehakt:

'bool' ?? In der Reference steht nur was von 'boolean'.
Kann ich 'bool' auch verwenden?
Der Compiler meckert schon mal nicht.

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

EDIT: 1.5.8 kann es schon

Das boolean typedef macht übrigens Probleme. Gerade das gefunden:

Wurde vor zwei Tagen ausgebessert:

Siehe auch das für eine ausführlichere Erklärung weshalb boolean problematisch ist:
http://forum.arduino.cc/index.php?topic=252120.msg1785228#msg1785228

Ach, ja das Syntax Highlighting kann man in /lib/keywords.txt anpassen

Ähh,

kannst du es für mich abkürzen? :-*

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.

z.B.:

bool test1 = 57;
Serial.println((int)test1);

boolean test2 = 57;
Serial.println((int)test2);

Ausgabe:
1
57

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)
{
}

ok,
verständlich erklärt.

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:

digitalWrite(LED_gn, true);

Läuft aber.

Fazit für mich:

  • In Zukunft bool verwenden.
  • Meine IDE nach deinem Vorschlag anpassen:

Wurde vor zwei Tagen ausgebessert:
Arduino custom type boolean is now mapped to bool type · arduino/Arduino@20ac20f · GitHub

Oder gleich auf die Neue IDE umsteigen.

Finde es nur irgendwie "lustig", dass dies erst vor 2 Tagen ausgebessert wurde.

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.