digitalWrite(dataB, grp == 0 ? 0 : 1);

Hallo,

könnte mir bitte jemand folgende Zeile bzw Befehl erläutern:
digitalWrite(dataB, grp == 0 ? 0 : 1);
Einen Befehl mit Fragezeichen ist mir bisher nicht begegnet.

Tschüß
der Lokgeist

Nennt sich Konditional Operator

Das ist nicht anderes als:

if (grp == 0)
{
   digitalWrite(dataB, 0);
}
else
{
   digitalWrite(dataB, 1);
}

Oder allgemein:

"Bedingung auswerten" ? "wenn wahr" : "wenn falsch"

Damit kann man auch sowas machen:

int var = (x == 5) ? y : z;

Also eine Variable bedingt initialisieren. Das geht mit einem if/else nicht so, da man die Variable vorher deklarieren muss

1 Like

Lokgeist:
könnte mir bitte jemand folgende Zeile bzw Befehl erläutern:
digitalWrite(dataB, grp == 0 ? 0 : 1);
Einen Befehl mit Fragezeichen ist mir bisher nicht begegnet.

Wenn es dir noch nicht begegnet ist, warum schreibst du es denn?

Es ist kein Befehl sondern ein Operator.

Hier nachlesen (einmal gegogelt)

Serenifly erklärt es natürlich besser :wink:

Hallo,

danke für die hilfreichen und sehr schnellen Antworten.

Tschüß
der Lokgeist

das von dir gefragte

digitalWrite(dataB, grp== 0 ? 0 : 1;

ist nichts anderes als

digitalWrite(dataB, grp);

warum das so kompliziert geschrieben wurde, wer weiß das schon

ElEspanol:
das von dir gefragte

digitalWrite(dataB, grp== 0 ? 0 : 1;

ist nichts anderes als

digitalWrite(dataB, grp);

warum das so kompliziert geschrieben wurde, wer weiß das schon

Na so ganz stimmt das dann doch nicht, du gehst davon aus, dass grp nur die Werte 0 und 1 annehmen kann. Sauberer und universeller ist dann nur Sereniflys Methode.

ElEspanol hat m.E. aber Recht.... Denn das ausgewertete Ergebnis ist in diesem Fall nur 1 oder 0, also "true" oder "false", oder HIGH bzw. LOW. Wenn man sich die binären Sachen genauer ansieht stellt man fest, dass 0 "false" ist ... und "alles ungleich 0" = "true". Somit hat seine Aussage in diesem Fall Bestand.

Ich gehe mal viel eher davon aus, dass dieser Codeschnippsel ein Überbleibsel einer nicht ganz abgeschlossenen Optimierung der Entwicklung ist. Oder der Entwickler versucht damit, seine "Handschrift" wiederzuerkennen falls irgendwo bedenkenlos abgekupfert wird...

Es sieht ja auch viel intelligenter aus wenn man schreibt:
1und1.jpg
als wenn man das schnöde 1+1=2 in den Code meißelt...

RudiDL5:
ElEspanol hat m.E. aber Recht.... Denn das ausgewertete Ergebnis ist in diesem Fall nur 1 oder 0, also "true" oder "false", oder HIGH bzw. LOW. Wenn man sich die binären Sachen genauer ansieht stellt man fest, dass 0 "false" ist ... und "alles ungleich 0" = "true". Somit hat seine Aussage in diesem Fall Bestand.

Genau das ist meine Annahme.
Sonst hätte ich
digitalWrite(dataB, !!grp);geschrieben

digitalWrite(dataB, !!grp);

Sogar das ist unnötig:

void digitalWrite(uint8_t pin, uint8_t val)
{
    ...

	if (val == LOW) {
		*out &= ~bit;
	} else {
		*out |= bit;
	}


  ...
}

Also alles ungleich 0 wird als wahr interpretiert. Damit kann man übergeben was man will

eben. das ist ja meine Meinung. Aber in manchen Fällen ist es bei bool notwendig, dass es eben 0 oder 1 ist, und nicht irgendeine Zahl. Dann nehm ich !! um aus irgendeiner Zahl 1 zu machen

Aber in manchen Fällen ist es bei bool notwendig

Bei bool nie. Bool ist ein Datentyp der nur 0 oder 1 sein kann. In früheren Arduino Version war boolean aber nur ein typedef auf unsigned char (wie früher in C). Da war das manchmal nötig. Jetzt ist boolean ein typedef für bool.

Habs gerade in der 1.6.5 mal nachvollzogen, da scheint bleibt bool bei 0 oder 1, auch bei bool x=5; ist x nur 1. Also kann ich mir die !! sparen.

Hallo

nochmals danke.

Ich habe auch die letzten Kommentare gelesen. Die sind für mich als Anfänger und Laie aber zu tiefgründig.

Danke
der Lokgeist

Lokgeist:
aber zu tiefgründig.

Ist auch uninteressant geworden, da ja die aktuelle IDE das nun richtig macht.

War z.B. wichtig wenn man gerne Klartextausgaben von logischen Zuständen macht:

bool ventilstellung, relais:
char Zustandklartext[] = {"AUS", "AN", "NEIN", "JA", "ZU", "OFFEN", "LOW", "HIGH", "Deaktivert", "Aktiv", "Aktiv", "Deaktivert"};
.......
Serial.print("Ventil: ");
Serial.println(Zustandklartext[ventilstellung+4]);
Serial.print("Relais: ");
Serial.println(Zustandklartext[ventilstellung+6]);

Wenn da die bool Variablen nicht 0 und 1, sondern 0 und irgendwas wären, würden aus dem Array die falschen Zustände gelesen werden.