Verständnisfrage - und / oder Abfrage

Hallo in die Runde- meine Frage ist wahrscheinlich sehr banal.... ich steh aber grad total auf den Schlauch...

es geht um folgende Zeilen:

    if (Sensor5[3] == 0 && (Sensor4[3] == 1 || Sensor4[4] == 1 || Sensor4[5] == 1))
  {
    Status5[3] = 0;
    Status5[1] = 5000;
  }

Hier frage ich 4 PIRs ab.... Die Bedingung soll erfüllt sein, wenn "Sensor5[3]" LOW ist und min. einer der 3 folgenden Sensoren HIGH ist....

Eine Möglichkeit ist:

  if ((Sensor5[3] == 0 && Sensor4[3] == 1) || (Sensor5[3] == 0 && Sensor4[4] == 1 )|| (Sensor5[3] == 0 && Sensor4[5] == 1)) {

}

Aber evtl. gibt es noch einfacherer Lösungen.

Hallo,

so etwas ähnliches hatten wir letzte Tage schon einmal - ich findes es hier blos nicht auf die Schnelle. Es ist bei logischen Verknüpfungen ("Boolsche Algebra") genau so wie normaler Mathematik: Punktrechnung vor Strichrechnung. Ebenso gibt es hier eine Hierachie bei den boolschen Vergleichen.

In deiner Abfrage wird erst X AND Y verglichen ... und DANN das Ergebnis mit ODER verbunden. Pack also die gesamte ODER-Struktur noch in zusätzliche Klammern und dann müsste es gehen.

Also ... AA && ( BB || CC || DD )

So in der Art
Rudi

EDIT:
Jessas - HotSystems war mal wieder schneller...

aber ich habs ja in Klammern.... :o

MaHa76:
aber ich habs ja in Klammern.... :o

Dann sieh dir meinen Vorschlag genau an.

HotSystems:

 if ((Sensor5[3] == 0 && Sensor4[3] == 1) || (Sensor5[3] == 0 && Sensor4[4] == 1 )|| (Sensor5[3] == 0 && Sensor4[5] == 1)) {

}

Da gilt aber genau wie beim Distributivgesetz bei Grundrechenarten, dass man Sensor[5]3 ausklammern kann:

Rein von der boolschen Logik her sollte der ursprüngliche Code eigentlich gehen

Eigentlich schon. Verzwickt ist es immer wenn in gemischter Logik gedacht wird. Auf der einen Hälfte positive Logik, in der anderen Hälfte negative. Hier verhaspelt man sich leicht, zumal X==0 ja schon wieder TRUE ergibt. Man müsste dann m.E. den 1. Ausdruck negieren (wie auch immer ich das beschreiben soll).

Oder ganz einfach (für Leute wie mich) eine Wahrheitstabelle malen wie damals bei den 7400-Chips. Das geht dann sauber raus und wirkt sofort einleuchtend (für MICH...)

ich lese mich bei dem Link mal rein.... danke an der Stelle schon mal.

Serenifly:
Da gilt aber genau wie beim Distributivgesetz bei Grundrechenarten, dass man Sensor[5]3 ausklammern kann:

Rein von der boolschen Logik her sollte der ursprüngliche Code eigentlich gehen

Ja das sehe ich auch so.
Allerdings habe ich vor längerer Zeit mal an einer ähnlichen Problematik gehangen und es nur über den umständlichen Weg gelöst. Daher hier mein Post.

Bist du sicher dass die Variablen und dabei vor allem die Indizes korrekt verwendet werden?

Wenn du verschiedenen Indizes übrigens eine bestimmte Bedeutung haben, dann sollte man daher eher ein struct statt ein Array nehmen. Dann hat man aussagekräftige Namen.

MaHa76:

    if (Sensor5[3] == 0 && (Sensor4[3] == 1 || Sensor4[4] == 1 || Sensor4[5] == 1))

{
    Status5[3] = 0;
    Status5[1] = 5000;
  }

Was haltet ihr denn davon?
if (!Sensor5[3] && (Sensor4[3] + Sensor4[4] + Sensor4[5]))

ElEspanol:
if (!Sensor5[3] && (Sensor4[3] + Sensor4[4] + Sensor4[5]))

Ganz nett :slight_smile:

Statt dem + könnte man auch | machen (bitweises ODER)

Ist aber letztlich nur eine andere Syntax. Die Bedeutung ist 100%ig identisch

Was haltet ihr denn davon?
if (!Sensor5[3] && (Sensor4[3] + Sensor4[4] + Sensor4[5]))

Ich halte nichts davon, Variable zu verwenden die nicht definiert sind.
Warum verwendest du Arrays ?

Man kann mehrere bool mit + zu einem int vermuscheln und die Summe per && auf != 0 abfragen.
Warum nimmst du nicht*statt&&?
Das würde das ganze noch trickreicher aussehen lassen ...

Ich nutze arrays, weil ich die Daten via nrf24 als arrays verschicke.... die Zuordnung paßt- ich lasse mir die nebenbei auf ein einem Display anzeigen und sehe auch da den Status der Sensoren.... Sollte/könnte ich statt 1 und 0 HIGH und LOW schreiben? macht das einen Unterschied?

Moin,
gemäß Fragestellung am Anfang des Beitrages habe ich heute morgen beim Frühstück folgende Zeichnung gepinselt:

boolean.gif

Die im Verlauf der Unterhaltung gezeigten Verknüpfungen und auch besonders nach Aussage von Serenifly müssten demnach funktionieren. Wenn aber dennoch das falsche Ergebnis geliefert wird (was der letzte Post quasi beinhaltet) ist die Fragestellung nach meiner Sichtweise falsch.
:confused:

(Sorry für meine altmodischen Symbole, mit den eckigen Blöcken gemäß DIN komme ich nicht wirklich klar)

das entspricht ja eigentlich meiner Lösung… hm…

Ich gehe davon aus, dass es geht, und du nur um eine Meinung gefragt hast, ob + oder | besser ist.

Dass | oder || eine C-Schreibweise für Rudis V Operator ist, sollte eigentlich klar sein.
Dass + auch gehen kann, sollte auch klar sein, aber was der Vorteil sin soll, ist mir nicht klar.

Es funktioniert leider nicht so ganz...

ich sehe auf dem Display die 4 PIR Zustände und den Ausgabewert. Wenn nur einer der PIRs high ist, der high sein soll, scheint die Bedingung nicht erfüllt zu sein... ich werde das ganze noch mal anders nachstellen/prüfen... nicht dass das Display nur zu träge ist...

lass es dir doch seriell ausgeben, sobald die Bedingung erfüllt ist.

MaHa76:
Ich nutze arrays, weil ich die Daten via nrf24 als arrays verschicke

Du kannst auch mit & die Adresse eine structs bekommen und mit sizeof() dessen Größe...