Arduino Forum

International => Deutsch => Topic started by: Lokgeist on Aug 31, 2016, 10:46 pm

Title: digitalWrite(dataB, grp == 0 ? 0 : 1);
Post by: Lokgeist on Aug 31, 2016, 10:46 pm
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
Title: Re: digitalWrite(dataB, grp == 0 ? 0 : 1);
Post by: Serenifly on Aug 31, 2016, 10:55 pm
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
Title: Re: digitalWrite(dataB, grp == 0 ? 0 : 1);
Post by: HotSystems on Aug 31, 2016, 10:56 pm
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) (http://www.peacesoftware.de/ckurs6.html)

Serenifly erklärt es natürlich besser ;)
Title: Re: digitalWrite(dataB, grp == 0 ? 0 : 1);
Post by: Lokgeist on Aug 31, 2016, 11:00 pm
Hallo,

danke für die hilfreichen und sehr schnellen Antworten.

Tschüß
der Lokgeist
Title: Re: digitalWrite(dataB, grp == 0 ? 0 : 1);
Post by: ElEspanol on Aug 31, 2016, 11:52 pm
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
Title: Re: digitalWrite(dataB, grp == 0 ? 0 : 1);
Post by: sth77 on Sep 01, 2016, 09:55 am
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.
Title: Re: digitalWrite(dataB, grp == 0 ? 0 : 1);
Post by: RudiDL5 on Sep 01, 2016, 10:09 am
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...




Title: Re: digitalWrite(dataB, grp == 0 ? 0 : 1);
Post by: ElEspanol on Sep 01, 2016, 11:32 am
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
Title: Re: digitalWrite(dataB, grp == 0 ? 0 : 1);
Post by: Serenifly on Sep 01, 2016, 04:02 pm
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
Title: Re: digitalWrite(dataB, grp == 0 ? 0 : 1);
Post by: ElEspanol on Sep 01, 2016, 05:56 pm
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
Title: Re: digitalWrite(dataB, grp == 0 ? 0 : 1);
Post by: Serenifly on Sep 01, 2016, 06:10 pm
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.
Title: Re: digitalWrite(dataB, grp == 0 ? 0 : 1);
Post by: ElEspanol on Sep 01, 2016, 07:01 pm
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.
Title: Re: digitalWrite(dataB, grp == 0 ? 0 : 1);
Post by: Lokgeist on Sep 01, 2016, 07:19 pm
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
Title: Re: digitalWrite(dataB, grp == 0 ? 0 : 1);
Post by: ElEspanol on Sep 02, 2016, 11:17 am
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.