Go Down

Topic: digitalWrite(dataB, grp == 0 ? 0 : 1); (Read 2475 times) previous topic - next topic

Lokgeist

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

Serenifly

Nennt sich Konditional Operator

Das ist  nicht anderes als:
Code: [Select]

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


Oder allgemein:
Code: [Select]

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


Damit kann man auch sowas machen:
Code: [Select]

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

HotSystems

#2
Aug 31, 2016, 10:56 pm Last Edit: Aug 31, 2016, 10:57 pm by HotSystems
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 ;)
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

Lokgeist

Hallo,

danke für die hilfreichen und sehr schnellen Antworten.

Tschüß
der Lokgeist

ElEspanol

das von dir gefragte

Code: [Select]
digitalWrite(dataB, grp== 0 ? 0 : 1;
ist nichts anderes als
Code: [Select]
digitalWrite(dataB, grp);
warum das so kompliziert geschrieben wurde, wer weiß das schon

sth77

das von dir gefragte

Code: [Select]
digitalWrite(dataB, grp== 0 ? 0 : 1;
ist nichts anderes als
Code: [Select]
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.
Mein verwaister Arduino-Blog: http://www.sth77.de/ - letzter Eintrag: Diamex-ISP in der irgendwann mal aktuellen Arduino-IDE 1.6.4

RudiDL5

#6
Sep 01, 2016, 10:09 am Last Edit: Sep 01, 2016, 10:10 am by 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.

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:

als wenn man das schnöde 1+1=2 in den Code meißelt...




ElEspanol

#7
Sep 01, 2016, 11:32 am Last Edit: Sep 01, 2016, 11:33 am by ElEspanol
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
Code: [Select]
digitalWrite(dataB, !!grp);geschrieben

Serenifly

Code: [Select]

digitalWrite(dataB, !!grp);


Sogar das ist unnötig:
Code: [Select]

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

ElEspanol

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

Serenifly

Quote
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.

ElEspanol

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.

Lokgeist

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

ElEspanol

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:

Code: [Select]
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.

Go Up