Wo ist der Fehler??

Gast #2342180
Lesenswert?

Autsch. Das:

Sören schrieb:
> PORTF |= (1<<PF1) && PORTF |= (1<<PF3);

muss korrekt natürlich so heißen:
1
PORTF |= (1<<PF1) | (1<<PF3);

Wenn eine andere Funktionalität beabsichtigt gewesen wäre, hätte man das 
auch z. B. so umbauen können:
1
PORTF |= (1<<PF1) && (PORTF | (1<<PF3));

;)
Gast #2342184
Lesenswert?

Patrick schrieb:
> muss korrekt natürlich so heißen:
> PORTF |= (1<<PF1) | (1<<PF3);

sieht zwar gut aus hat aber nebenwirkungen. Es kommt jetzt auf die 
Hardware an. Wenn es ein Atmel ist dann wird hier erst PORTF eingelesen 
und dann wieder zurückgeschrieben. Das könnte Probleme machen wenn es 
noch interupts gibt die auch PORTF verwenden.
Wenn es auch ok, das man die beiden pins nicht gleichzeitig setzt würde 
ich liber so schreiben.

PORTF |= (1<<PF1);
PORTF |= (1<<PF3);

das ist je nach hardware sogar schneller.
#2342188
Lesenswert?

Sören schrieb:
> Also steht "|" für und??

Nein, für (binäres) ODER.

Allerdings ist die Umngangssprache da sehr ungenau.
Wenn du sagst "im Ergebnis muß ein Bit gesetzt sein, daß in dem einen 
Operanden vorkommt, und eines, das im anderen Operanden vorkommt", dann 
entspricht das der eher mathematischen Aussage "im Ergebnis sollen alle 
Bits gesetzt sein, die im einen oder dem anderen Operanden gesetzt 
sind".

Diese verwaschene Bedeutung in der deutschen Sprache sorgt öfters für 
Verwirrung, da muß man durch.

Das korrekt gemeinte "in einem Operanden gesetzt und im anderen" führt 
im Ergebnis nur zu einem gesetzten Bit, wenn an der entsprchenden Stelle 
in beiden Operanden das Bit gesetzt ist.
#2342198
Lesenswert?

Sören schrieb:
> Okay.
> Also steht "|" für und??

Wenn du schon so fragst, brauchst du dringend ein C-Buch und ein paar 
Vorabübungen auf einem PC. C programmieren auf einem PC hat den Vorteil, 
dass du wesentlich bessere Einsteigerbedingungen hast um die Grundlagen 
zu lernen. Das Buch wird dir die Anfänge in einer systematischen Art und 
Weise von der Pieke auf beibringen.


| steht für Oder

Aber das ist hier nicht der springende Punkt. Der springende Punkt ist, 
dass nicht jedes umgangssprachlich gesprochende UND sich in einem 
Zeichen in der Sprache C niederschlägt. In diesem Fall bedeutet dieses 
UND im Satz "setze Ausgang A UND setzte Ausgang B" nämlich keine 
irgendwie logische Verknüpfung von 2 Aussagen sondern es bedeutet ganz 
einfach: "zuerst mach das, danach mach das". Maximal könnte man noch 
"mach die beiden Dinge A und B in einem Aufwasch" darin sehen. In C 
schreibst sich das im einfachsten Fall einfach als 2 Anweisungen 
hintereinander, eine Sequenz, die abgearbeitet wird

    Setze Ausgang A;
    Setze Ausgang B;

der Nettoeffekt der beiden Anweisungen ist, dass sowohl Ausgang A als 
auch (also UND) Ausgang B gesetzt ist.

Anderes Beispiel: "Gehe zum Fenster UND mache es auf". Obwohl hier ein 
UND verwendet wird, bedeutet dieser Satz einfach nur die Sequenz

    Zum Fenster gehen;
    Fenster öffnen;

Das ist aber etwas völlig anderes, als das UND in "Wenn es regnet UND 
ich keinen Schirm habe, dann werde ich nass". Hier verknüpft das UND 2 
Bedingungen zu einer Komplettaussage. Und es ist dieses UND, welches 
sich in C in Form eines & oder eines && wiederfindet.

Gerade wenn es um die Wörter UND bzw. ODER geht, sind wir in der 
gesprochenen Sprache unglaublich schlampig. Das macht insofern nichts, 
weil unser Gehirn die Dinge trotzdem richtig aussortiert und die 
Bedeutung rausfindet. Man muss da sehr genau aufpassen, ob man hier 
nicht einem logischen Trugschluss aufsitzt, wenn man die UND bzw. ODER 
aus der gesprochenen Sprache einfach übernimmt und 1:1 in eine 
Programmiersprache abbildet.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren