Go Down

Topic: Logische und / oder Abfrage (Read 2125 times) previous topic - next topic

jemhadar

Jan 19, 2013, 04:12 pm Last Edit: Jan 19, 2013, 07:46 pm by jemhadar Reason: 1
Hallo zusammen
freut mich das wir hier auch einen deutschen teil haben
das macht die sache hoffentlich einfacher.

folgende situation bereitet mir momentan  kopfzerbrechen.

ich arbeite mit mehreren Arduino Mega 2560  über  I2C  Bus.

das programm funktioniert sehr gut.

aus einem arduino werden pins eingelesen  im  master wird verarbeitet andere arduinos geben die befehle an pin ausgänge weiter.

nur jetzt bekomme ich gerade graue haare  die oder Abfrage funktioniert einfach nicht.


UND abfrage funktioniert perfekt auch mit vielen variabeln.
der unten genannte code: lese aus buffer  variable E_SIGR_ASR5_HALT  und  E_SIGR_ASR3_HALT , wenn beide 1 sind dann setze ausgangs buffer Variabel A_SIGS_ASH4_HALT auf 1
getestet funktioniert in der anwendung.

Bsp:

Code: [Select]


if(HIGH==master_x.dio_get(E_SIGR_ASR5_HALT) && HIGH==master_x.dio_get(E_SIGR_ASR3_HALT))
 {
  master_x.dio_set(A_SIGS_ASH4_HALT,HIGH);
 }


ODER abfrage leider gar nicht
Wenn ich jetzt statt  und  eine  oder verknüpfung  dann fangen die probleme an
nur wenn beide  variablen  1 sind wird der ausgang gesetzt und sonst nicht. also macht auch in dem unten genannten beispiel der compiler ein und Gatter draus was nicht sein darf.

Code: [Select]

if(HIGH==master_x.dio_get(E_SIGR_ASR5_HALT) || HIGH==master_x.dio_get(E_SIGR_ASR5_HALT))
 {
  master_x.dio_set(A_SIGS_ASR4_HALT,HIGH);
 }


Hat jemand von euch schon mal so ein problem gehabt
weil ich hab momentan keine idee wo das problem liegt.

lg
Thomas



michael_x

Quote
ich hab momentan keine idee wo das problem liegt.

Bis auf die falschePosition von "HIGH==" ich auch nicht.

Da HIGH das gleiche ist wie true und 1 kannst du das HIGH == einfach weglassen, wenn deine Methode dio_get nur true/false zurückliefert.

markbee

#2
Jan 19, 2013, 05:40 pm Last Edit: Jan 19, 2013, 05:43 pm by markbee Reason: 1
Wie mein Vorredner sagt, stimmt die Position von  "HIGH==" nicht:
DIe richtige Schreibweise ist folgende:

Einfache Bedingung:
if (variable == HIGH) {
tue was
}

UND-Verknüpfung:
if (variableA == HIGH && variableB == HIGH) {
tue was
}
Kurzform:
if(variableA && variableB) {
tue was
}

ODER:
if (variable == HIGH || variableB == HIGH) {
tue was
}
Kurzform:
if(variableA || variableB) {
tue was
}
XBee blog: http://lookmanowire.blogspot.com/

jemhadar

ja ich werde das testen ob das die ursache ist

bei der &&  Verknüpfung ist es egal

der hintergrund daran liegt einfach daran

variable == high   -> abfrage
variable = high  ->  zuweisung

die überlegung  war im code
somit kann ein programmierfehler im code erkannt werden.

High ==  variable    -> abfrage
high = variable  ->  fehlermeldung des  compilers.

auf alle fälle guter tip
wenns das wirklich ist geb ich ein bier aus  :D


mde110

#4
Jan 19, 2013, 07:26 pm Last Edit: Jan 19, 2013, 07:28 pm by mde110 Reason: 1
Soll das nicht anstatt
Code: [Select]
if(HIGH==master_x.dio_get(E_SIGR_ASR5_HALT) || master_x.dio_get(HIGH==E_SIGR_ASR5_HALT)) so sein:
Code: [Select]
if(HIGH==master_x.dio_get(E_SIGR_ASR5_HALT) || HIGH==master_x.dio_get(E_SIGR_ASR5_HALT))??

Die Position des HIGH ist meiner Ansicht nach nicht relevant.
Das Voranstellen ist von Vorteil um die Verwechslung von = und == einzuschränken.

jemhadar

@ mde   ja sorry war nur ein tipfehler hier von mir.

jurs


if(HIGH==master_x.dio_get(E_SIGR_ASR5_HALT) || HIGH==master_x.dio_get(E_SIGR_ASR5_HALT))


Es wird der Code ausgeführt, den Du programmiert hast und nicht der Code, den Du (vermutlich) beabsichtigt hast.

Wenn ich mal die Klammern setze, so wie es ausgeführt wird, dann steht da:
if(HIGH== (master_x.dio_get(E_SIGR_ASR5_HALT) || HIGH) ==master_x.dio_get(E_SIGR_ASR5_HALT))

Dieser Ausdruck ist wahr, wenn "master_x.dio_get(E_SIGR_ASR5_HALT) || HIGH" wahr ist und ebenfalls "master_x.dio_get(E_SIGR_ASR5_HALT)".

Beabsichtigt von Dir war vermutlich:
if((HIGH==master_x.dio_get(E_SIGR_ASR5_HALT)) || (HIGH==master_x.dio_get(E_SIGR_ASR5_HALT)))

Du darfst die Klammern um die einzelnen logischen Ausdrücke nicht weglassen!

jemhadar

in den programmierbeispielen  sind aber auch keine klammern ?

|| (logical or)

True if either operand is true, e.g.

if (x > 0 || y > 0)
   {
    // ...
   }

jurs


in den programmierbeispielen  sind aber auch keine klammern ?


Stimmt, die Wertigkeit der Vergleichsoperatoren ist höher als die Wertigkeit der || und && Operatoren, also vergiss meinen letzten Beitrag.

Wie sieht es denn mit den Funktionen aus, was liefern die zurück? Sind die Funktionen so programmiert, dass sie einen logischen Wert (true, false, HIGH, LOW) zurückliefern, oder können diese irgendwelche anderen Werte zurückliefern?

jemhadar

die  funktionen  liefern nur  0 od 1  also High oder Low zurück 
gelesen wird aus einem bitbuffer.

bei  &&  funktioniert ja komischer weise alles
nur ||  macht  zicken

das ist das was mich so stuzig macht.

mde110

Dann hole dir die Werte mal vor dem Vergleich in zwei Bool Variablen. Um zu sehen, was passiert, schreibst du sie mit Serial.print an den Monitor.
Im Vergleich Sollte auch ein Serial.print("TRUE") sein um zu sehen wann IF TRUE.
Das gleiche kommt dann noch in die ELSE rein: Serial.print("FALSE")

Dann poste nochmal deinen Code und das Monitor ergebnis.



Es wird der Code ausgeführt, den Du programmiert hast und nicht der Code, den Du (vermutlich) beabsichtigt hast.


:smiley-mr-green:

jemhadar

hallo  mahlzeit

habe heute einige versuche gestartet  alle mit dem selben ergebnis das  ich mit oder ohne  klammern nicht zu dem gewünschen erfolg komme.
oder  HIGH  vorangestellt oder hinten  ist auch egal.
somit kann ich trotz der guten tips kein bier ausgeben.


@ mde
deinen  oben genannten vorschlag werde ich noch  testen  das habe ich noch nicht probiert.

lg
Thomas

vieledinge

Kannst Du mal die Deklaration von master_x.dio_get() posten?

jemhadar

Hallo  zusammen hier ist die Lösung

es war ein einfacher ganz dummer programmierfehler meinerseits.

Der Fehler war nicht im Setzbefehl sondern beim Rücksetzen.

wenn ich

A==1 || B==1   dann setze  C==1  dann muss ich  natürlich beim Rücksetzen   A==0 && B==0  Rücksetze C==0   verwenden.

ich hatte auch beim rücksetzen  :smiley-red:  A==0 || B==0  Rücksetze C==0    .....kann einfach nicht funktionieren

lg

uwefed

Vor allem funktioniert das nicht wenn man C==0 zum rücksetzen verwendet. Man muß C=0 schreiben.

Hab nochmal aufmerksam die ganze Diskussion gelesen und finde keinen Hinweis auf das wirkliche Problem.

Du schreibst als Fehlerbeschreibung:
Quote

UND abfrage funktioniert perfekt auch mit vielen variabeln.
der unten genannte code: lese aus buffer  variable E_SIGR_ASR5_HALT  und  E_SIGR_ASR3_HALT , wenn beide 1 sind dann setze ausgangs buffer Variabel A_SIGS_ASH4_HALT auf 1
getestet funktioniert in der anwendung.
....
ODER abfrage leider gar nicht
Wenn ich jetzt statt  und  eine  oder verknüpfung  dann fangen die probleme an
nur wenn beide  variablen  1 sind wird der ausgang gesetzt und sonst nicht. also macht auch in dem unten genannten beispiel der compiler ein und Gatter draus was nicht sein darf.

und dann als Lösung:
Quote
dann muss ich  natürlich beim Rücksetzen   A==0 && B==0  Rücksetze C==0   verwenden.


Es wäre schön gewesen wenn das Problem überhaupt behandelt worden wäre.
ODer-Verknüpfungen um zu kontrollieren ob beide Variablen LOW sind funktionieren nicht aber davon hastt Du nichts geschreiebn.

Grüße Uwe

Go Up