mikrocontroller.net

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


Autor: Sebastian Z. (sz1985)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Klaus Wachtler (mfgkw)
Datum:

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

Autor: Michael G. (linuxgeek) Benutzerseite
Datum:

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

Autor: Huch (Gast)
Datum:

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

Autor: Huch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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:
x = *(data+2);
if (x > 0 && x < 126) {
//Tu was..
}
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...

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Carsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Skua (Gast)
Datum:

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

Ich neige dazu mehr zu Klammern.

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

Habs gern extra deutlich.

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Sebastian Z. (sz1985)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank.

Konnte das Problem dank eurer Hilfe lösen.

Autor: guest (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ist wirklich schön für dich..

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

Autor: Rico S. (donricone)
Datum:

Bewertung
0 lesenswert
nicht 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 ;)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.