Wert einer Zuweisung !

Gast #180297
Lesenswert?
• ▲
▼
Ich hab mir mal gedacht, nutze die Sache, die mich beim AVR immer ärgert
(setze 1 damits 0 wird) und schon falle ich auf die Nase.

Wenn ich eine Zuweisung teste, müßte doch eine Kopie der Zuweisung
ausgewertet werden ?

Aber der Compiler liest das GIFR nochmal ein, was natürlich in die Hose
geht.

Hier mal der Code:


    if( PIND & 1<<PD2 || (GIFR &= 1<<INTF0) ){  // check hanging on SDA
low
 b2a:   82 99           sbic    0x10, 2 ; 16
 b2c:   06 c0           rjmp    .+12            ; 0xb3a
 b2e:   8a b7           in      r24, 0x3a       ; 58
 b30:   80 74           andi    r24, 0x40       ; 64
 b32:   8a bf           out     0x3a, r24       ; 58
 b34:   8a b7           in      r24, 0x3a       ; 58
 b36:   88 23           and     r24, r24
 b38:   29 f0           breq    .+10            ; 0xb44
      Timeout_sda = time;


Mit anderen Worten, man kann nicht eine Zuweisung testen, wenn das
Register nicht 100% identisch rücklesbar ist.


Peter
Gast #180298
Lesenswert?
• ▲
▼
Anderes Problem:
In diesem Beispiel verlässt Du Dich darauf, dass alle Teile in der
if-Abfrage ausgeführt werden. Ist der erste Teil (PIND & 1<<PD2) aber
true, dann wird sofort in den Ausführungsteil gesprungen (was übrigens
C-konform ist). Die Zuweisung (GIFR &= 1<<INTF0) wird also garnicht
ausgeführt, wenn (PIND & 1<<PD2) true ist!

Viele Grüße, Stefan
Gast #180299
Lesenswert?
• ▲
▼
@peter: So ist die Sprache C nun einmal definiert. Das Ergebnis einer
Zuweisung ist der Wert der linken Seite, d.h der Inhalt der Variablen
oder des Registers, nach der Zuweisung. Wenn die als "volatile"
deklariert ist, dann sagt das dem Compiler, dass er noch einmal lesen
muss. Jeder andere korrekte Compiler verhält sich genauso (z.B.
Microsoft, Digital Mars).
#180301
Lesenswert?
• ▲
▼
@Jörg,

"warum man 1 setzen muss..."

ja, daß weiß ich längst, ärgere mich jedesmal darüber.

Ich wollte ja nur das Testen und Löschen in einem Abwasch erledigen.

Aber das Beispiel hat mir gezeigt, daß Mehrfachzuweisungen sehr
gefährlich sein können und deshalb besser vermieden werden sollten.

Ein hübsches Beispiel ist noch:

x = UDR = y:

Dann enthält x alles mögliche, aber bloß nicht den Wert von y.

Peter

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.