Merkwürdiges Verhalten bei der Negation



  • Hallo,

    habe bei folgender Konfiguration (Keil-C Compiler mit ARM7-M3-Cortex) ein sehr merkwürdiges Verhalten beim ~-Operator. (Folgendes funktioniert mit einem 8051 Keil C-Compiler)

    BYTE wert = readeep(adr);
    if (wert = ~readeep(adr + 0x60))
    {
    }
    

    Folgender Code funktioniert allerdings

    BYTE wert = readeep(adr);
    BYTE wert2 = ~readeep(adr + 0x60);
    if (wert = wert2)
    {
    }
    

    Ist der Code oben nicht ANSI-konform oder hat der C-Compiler von Keil ne Macke?

    Gruss L.



  • if (wert = wert2)
    

    🙄



  • was genau willst du machen? und was heißt bei dir "funktioniert nicht".

    Und bist du sicher, dass es

    BYTE wert = readeep(adr);
    if (wert = ~readeep(adr + 0x60))
    {
    }
    

    anstatt

    BYTE wert = readeep(adr);
    if (wert == ~readeep(adr + 0x60))
    {
    }
    

    richtig ist???



  • was gibt readeep() normalerweise zurück? bestimmt kein BYTE, oder?
    🙂



  • Hallo

    @supertux
    Ich lesse aus einem EEPROM Bytes aus und zwar an einer Adresse und an einer Adresse + 0x60. An der zweiten Adresse ist der gleiche Wert nocheinmal invertiert abgespeichert. Dies ist Code von einem Kollegen, der sagt, damit sicher er falsches auslesen ab. Soll ab und zu mal vorkommen. Wenn der Vergleich zutrifft, hat das Lesen funktioniert. Ich hoffe alle Klarheiten sind beseitigt.

    BYTE wert = readeep(adr);
    if (wert == ~readeep(adr + 0x60))
    {
    }

    natürlich hatte ich den Vergleich mit == gemacht, sonst würde der Code ja mit 8051-C-Compiler auch nicht laufen. Der Code was halt eingetippt und nicht kopiert, deshalb Tippfehler.

    @+fricky doch die Funktion readeep gibt ein BYTE zurück und BYTE ist wie folgt definiert

    typedef unsigned char BYTE;
    

    Wie gesagt das Progamm läuft auf 8051 Prozessoren und macht nur beim ARM7 die Probleme

    Gruss L.



  • dann macht dir der bit-dreher (~) bestimmt ein 'int' aus dem byte und setzt dir oben lauter einsen rein. ich weiss nich nicht mal, ob der compiler das darf (ich vermeide sowas eher intuitiv). versuchs mal so:

    if (wert = (BYTE)~readeep(adr + 0x60))
    {
    }
    

    vielleicht hilft's
    🙂



  • ääähm, mit == natürlich, nicht =
    🙂



  • if (wert = wert2)
    {
    }
    

    Das if ist TRUE wenn die Zuweisung wert = wert2 klappt. Das tut die meistens 🙂
    Sogar so gut wie immer ... Nimm ==



  • Scheppertreiber schrieb:

    Nimm ==

    das war nur ein tippfehler von ihm (5. beitrag von oben)
    🙂



  • Komisch, den "Bitdreher" '~' kenne ich gar nicht ...

    Mit Hardware die nicht zuverlässig ein Byte ausliest hätte ich eher Probleme.


Anmelden zum Antworten