Forum: Mikrocontroller und Digitale Elektronik warning: comparisons like X<=Y<=Z do not have their mathematical meaning


von Sebastian Z. (sz1985)


Lesenswert?

Hallo zusammen,

ich habe in meinem Programm eine if- Anweisung die eine Variable auf 
nicht kleiner als überprüfen soll. Nach dem kompilieren bekomme ich 
folgende Warnung

"warning: comparisons like X<=Y<=Z do not have their mathematical 
meaning".

Der Code Ausschnitt sieht wie folgt aus.

"if (! ( (0x01 <= *(data+2)) && (*(data+2) <= 0x7D) ))"

Bedeutet es, dass der Controller die Funktion kleiner bzw größer als 
nicht unterstützt, oder habe ich einen falschen Syntax verwendet?


Vielen Dank im Vorraus!

Gruss

Sebi

von Klaus W. (mfgkw)


Lesenswert?

Ich sehe hier keinen Grund für diese Warnung.
Ist das wirklich der richtige Ausschnitt?

von Michael G. (linuxgeek) Benutzerseite


Lesenswert?

Der Compiler will Dir damit sagen dass der "<="-Operator nicht transitiv 
ist. Aber bei obigen Code wird er das nicht erzeugen.

von Huch (Gast)


Lesenswert?

Der Codeauschnitt rechtfertigt die Meldung nicht.
Bezieht sie sich absolut sicher auf deie gezeigte Zeile?

von Huch (Gast)


Lesenswert?

Deine Beshreibung

> die eine Variable auf nicht kleiner als überprüfen soll.

passt auch nicht auf diese Zeile. Die tut nämlich noch mehr.

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Kommt eventuell auch drauf an was für Datentypen das sind, der Compiler 
und der Controller(?)...

Sebastian Z. schrieb:
> Bedeutet es, dass der Controller
Unglaublich aber wahr: Nicht alle benutzen den Controller... eine 
Angabe kann hilfreich sein..


Alles in allem aber auch ein sehr undurchsichtiges Konstrukt, ich würde 
erstmal dies: *(data+2) in eine lokale Variable auslagern, dann spart 
man sich ein paar Klammern und der Ausdruck lässt sich schreiben als:
1
x = *(data+2);
2
if (x > 0 && x < 126) {
3
//Tu was..
4
}
Ist zwar nicht so "cool" wie mit 10 Klammern und Hexwerten dafür sieht 
man auch nach 10 Jahren noch was man damit aussagen wollte...

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Sebastian Z. schrieb:
> Bedeutet es, dass der Controller die Funktion kleiner bzw größer als
> nicht unterstützt, oder habe ich einen falschen Syntax verwendet?
Die Funktion "kleiner als" bzw "größer als" ist keine Funktion, sondern 
ein Operator. Und es ist schnurzegal, ob der Controller den Operator 
unterstützt. Der Compiler muß ihn unterstützen...

von Carsten (Gast)


Lesenswert?

Hallo,

wie oben schon geschrieben worden ist, geht es nicht um das "kleiner 
gleich" an sich, sondern darum, dass 3 Werte auf einmal verglichen 
werden. Der Compiler möchte also nicht "x <= y <= z", sondern "(x <= y) 
&& (y <= z)".

Solche Ausdrücke werden einzeln abgearbeitet. D. h. erst wird "x <= y" 
ausgewertet und das Ergebnis (Wahr od. Falsch) dann mit "z" verglichen. 
Und ein Ausdruck wie "Wahr <= z" entspricht nicht der mathematischen 
Idee von "y <= z".



Carsten

von Peter D. (peda)


Lesenswert?

Sebastian Z. schrieb:
> "if (! ( (0x01 <= *(data+2)) && (*(data+2) <= 0x7D) ))"

Läubi .. schrieb:
> x = *(data+2);
> if (x > 0 && x < 126) {

Ein sehr schönes Beispiel, wie man kryptisch oder übersichtlich 
programmieren kann.


Peter

von Skua (Gast)


Lesenswert?

Peter Dannegger schrieb:
>> if (x > 0 && x < 126) {

Ich neige dazu mehr zu Klammern.

if ((x > 0) && (x < 126)) {

Habs gern extra deutlich.

von Klaus W. (mfgkw)


Lesenswert?

Abgesehen davon, daß es so nicht gleichbedeutend ist, finde ich
jetzt eine Zwischenvariable auch nicht besser.
Aber ist halt Geschmackssache, und eigentlich geht es hier nicht darum.

Gibt es den TO eigentlich noch?

von Sebastian Z. (sz1985)


Lesenswert?

Vielen Dank.

Konnte das Problem dank eurer Hilfe lösen.

von guest (Gast)


Lesenswert?

Das ist wirklich schön für dich..

Vielleicht ein paar Details dazu. Was war den die Lösung?

von Rico S. (donricone)


Lesenswert?

guest schrieb:
> Das ist wirklich schön für dich..
>
> Vielleicht ein paar Details dazu. Was war den die Lösung?

Wer lesen kann ist klar im Vorteil!

Carsten schrieb:
> Hallo,
>
> wie oben schon geschrieben worden ist, geht es nicht um das "kleiner
> gleich" an sich, sondern darum, dass 3 Werte auf einmal verglichen
> werden. Der Compiler möchte also nicht "x <= y <= z", sondern "(x <= y)
> && (y <= z)".
>
> Solche Ausdrücke werden einzeln abgearbeitet. D. h. erst wird "x <= y"
> ausgewertet und das Ergebnis (Wahr od. Falsch) dann mit "z" verglichen.
> Und ein Ausdruck wie "Wahr <= z" entspricht nicht der mathematischen
> Idee von "y <= z".
>
> Carsten

PS: Ja ich weiß wie alt der hier ist, hatt es aber gerade offen und 
konnte es nicht lassen ;)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.