Gast
#6230229
da hier grade die Diskussion war: A. S. schrieb: >> if ((P2IN & 0x02) == 1) oder A. S. schrieb: > if ((P2IN & 0x02)) wo ist der Unterschied?
|
Anzeige
|
Unterschied?
Gast
#6230229
da hier grade die Diskussion war: A. S. schrieb: >> if ((P2IN & 0x02) == 1) oder A. S. schrieb: > if ((P2IN & 0x02)) wo ist der Unterschied?
Gast
#6230239
kopr schrieb: > da hier grade die Diskussion war: > > A. S. schrieb: >>> if ((P2IN & 0x02) == 1) > > oder > > A. S. schrieb: >> if ((P2IN & 0x02)) > > wo ist der Unterschied? P2IN & 0x02 ist entweder 0 oder 2. Die erste Abfrage ist deshalb nie wahr. Im zweiten Fall ist die Abfrage wahr, wenn der Ausdruck ungleich Null ist. kopr schrieb: > if ((P2IN & 0x02) == 1) Diese Bedingung wird nie wahr. Diese könnte wahr werden:
Edit : Doppelpost - HildeK hats erklärt.
Gast
#6230247
okay, mein fehler. wenn if ((P2IN && 0x01) == 1) dann könnte die Aussage doch wahr werden? deswegen die verwechslung
Gast
#6230252
kopr schrieb: > ((P2IN && 0x02 kopr schrieb: > if ((P2IN && 0x01) == 1) Nö. das doppelte & steht nun für eine logische Verknüpfung und nicht für eine Bitmaske. Damit ist der Ausdruck wahr, wenn P2IN wahr ist und 0x01 wahr ist. Ist also nur ein Bit in P2IN high, ist der ganze Ausdruck (P2IN && 0x01) wahr, denn 0x01 ist ja immer wahr.
Gast
#6230267
Matthias S. schrieb: > Nö. das doppelte & steht nun für eine logische Verknüpfung. Damit ist > der Ausdruck wahr, wenn P2IN wahr ist und 0x01 wahr ist. Ist also nur > ein Bit in P2IN high, ist der ganze Ausdruck (P2IN && 0x01) wahr, denn > 0x01 ist ja immer wahr. ich meinte 0x02 und die hexa geben doch nur an, welcher Pin an aktiv ist. Also ein Pin 7.4 wäre entsprechend 0x10 und nicht 0x01 Nochmal: Das && steht für eine logische UND Verküpfung. Das & bildet hingegen eine Bitmaskierung.
Gast
#6230270
das ist doch so, als üwrde ich prüfen, ob der Int von einem bestimmten pin kommt P1IFG & 0x10
Gast
#6230274
Matthias S. schrieb: > chmal: Das && steht für eine logische UND Verküpfung. Das & bildet > hingegen eine Bitmaskierung. ja okay. Bin da noch unsicher was so eine Abfrage angeht.
Gast
#6230275
kopr schrieb: > P1IFG & 0x10 so prüfe ich ja, ob der Interrupt von 0x01 kommt. dabei dachte ich früher, es müsste && sein, da ja beide Seiten "wahr" sein müssen. Verstehst du was ich meine? kopr schrieb: >> P1IFG & 0x10 > > so prüfe ich ja, ob der Interrupt von 0x01 kommt. Es ist schon spät und es schleichen sich immer mehr Fehler bei dir ein. Mit 'P1FG & 0x10' kannst du nur Bit 4 abfragen und nicht etwa, ob ein Bit 0 gesetzt ist. Aber ich habe den Entprellkram bei dir verfolgt und verstehe immer noch nicht, warum die die kleinen Anpassungen in PeDas Original Code auf den MSP430 nicht machst und dann mit der Routine glücklich bist. Stattdessen schickst du im Interrupt immer noch serielle Meldungen ab und bremst dadurch alles aus. Von delays etc. ganz zu schweigen. Ich glaube nicht, das ich mich da reinziehen lassen will.
Gast
#6230282
kopr schrieb: > unsicher Nicht nur unsicher ... kopr schrieb: > P1IFG & 0x10 stellt eine logische UND Verknüpfung dar https://www.mikrocontroller.net/articles/Logische_Verkn%C3%BCpfungen und zwar bitweise (je 'Bit-Stelle'). kopr schrieb: > Matthias S. schrieb: >> chmal: Das && steht für eine logische UND Verküpfung. Das & bildet >> hingegen eine Bitmaskierung. > > ja okay. Bin da noch unsicher was so eine Abfrage angeht. Nein, nein, nein. Das ist nicht "Unsicherheit", sondern Unwissen. Fehlende Grundlagen in der Programmiersprache C. Die Operatoren "&" und "&&" mögen auf den ersten Blick ähnlich sein, tun aber ganz verschiedene Dinge! Das ist Handwerkszeug, das mußt du lernen. Oder du läßt das mit dem Programmieren. Lies den Abschnitt über C Operatoren in deinem bevorzugten C-Buch (oder https://de.wikibooks.org/wiki/C-Programmierung:_Ausdrücke_und_Operatoren). Speziell zu den Bit-Operatoren, die hier gebraucht werden, hat auch das hiesige Wiki einen Artikel: Bitmanipulation
Gast
#6230326
A=7 b=10 If (a =b) Ist immer erfüllt P1ifg =0x00 Tastee = 0x02 If (P1Ifg= 0x02) warum ist das nicht immer erfüllt Ich glaube das war die Frage von kopr Ikl schrieb: > If (P1Ifg= 0x02) warum ist das nicht immer erfüllt > > Ich glaube das war die Frage von kopr weil ein = kein Vergleich in C ist sondern eine Zuweisung! hier mit If? oder if oder IF ? wollte er eine boolsche Bedingung prüfen mit einem = klappt das z.B. in BASIC Axel S. schrieb: > Das ist nicht "Unsicherheit", sondern Unwissen. Fehlende Grundlagen in > der Programmiersprache C. auch das oder er war müde.
Gast
#6230335
Joachim B. schrieb: > weil ein = kein Vergleich in C ist sondern eine Zuweisung! Aber das ist doch der Punkt. Durch die zuweisung ist es doch immer erfüllt.
Gast
#6230455
kopr schrieb: > okay, mein fehler. wenn > if ((P2IN && 0x01) == 1) > dann könnte die Aussage doch wahr werden? deswegen die verwechslung Du blickst es nicht Lies dir nach mal die Kapitel Bitoperationen und logische Operationen in den C-Grundlagen durch. Beliebige willkürliche Mischungen funktionieren nicht. Wenn du ein Bitmuster auf irgendeinen bestimmten Wert prüfen willst, solltest du auch mit einem Bitmuster vergleichen.
oder
wären funktionierende Möglichkeit, wobei letztere auch nur funktioniert, weil C nicht vernünftig zwischen Ganzzahlen und Boolschen Werten unterscheidet - halt ein Hack aus den 70er-Jahren des vorigen Jahrhunderts, der sich bis heute erhalten hat. Und dann solltest du dir gut überlegen, an solchen Stellen wild dahergekommene Zahlen zu verwenden. Wehe du hast einen längeren Quelltext und willst ein Signal auf einen anderen Pin legen. Viel Spaß beim Suchen. kopr schrieb: > wo ist der Unterschied? Das ist ein sch..ß Titel Joachim B. schrieb: >> If (P1Ifg= 0x02) warum ist das nicht immer erfüllt >> >> Ich glaube das war die Frage von kopr > > weil ein = kein Vergleich in C ist sondern eine Zuweisung! Da müsste sogar der Kompiler meckern mit 'Probably unwanted assignment in line 42' oder so ähnlich. Als Flüchtigkeitsfehler ist das sicher uns allen schon mal passiert, aber gewollt haben es nur die wenigsten. Es hilft immer, sich die Warnungen genau anzusehen und sie auch nicht abzuschalten. So wird das nichts schrieb: >
oder
wären > funktionierende Möglichkeit, wobei letztere auch nur funktioniert, weil > C nicht vernünftig zwischen Ganzzahlen und Boolschen Werten > unterscheidet Vollkommen überzogene Rhetorik. In der Tat hat C erst vor verhältnismäßig kurzer Zeit einen eigenen Typ bool bekommen. Aber es gab schon immer Regeln, wie Standardtypen in Wahrheitswerte konvertiert werden. Und diese Regeln sind eindeutig und vernünftig. Was einem numerischen Wert 0 entspricht, ist falsch; alle anderen Werte ergeben wahr. Das ist im Prinzip genau das gleiche, was man in Assembler machen würde: der ALU den Wert zur Begutachtung vorlegen und dann auf das Z-Flag schauen. > ein Hack aus den 70er-Jahren des vorigen > Jahrhunderts, der sich bis heute erhalten hat. Es gibt gar keinen Grund, etwas an diesem Verhalten zu ändern. Schon gar nicht, wenn es existierenden (funktionierenden) Code kaputt machen würde. Matthias S. schrieb: > Joachim B. schrieb: >> >> weil ein = kein Vergleich in C ist sondern eine Zuweisung! > > Da müsste sogar der Kompiler meckern mit 'Probably unwanted assignment > in line 42' oder so ähnlich. Es wird aber nur eine Warnung geben. Schließlich ist der Code ja syntaktisch korrekt. Und wie du selber sagst: viele Leute lesen die Warnungen nicht bzw. schalten sie gleich ganz ab. > Als Flüchtigkeitsfehler ist das sicher uns > allen schon mal passiert, aber gewollt haben es nur die wenigsten. Ein guter Trick, wie man diesen Flüchtigkeitsfehler für den Compiler erkennbar macht, besteht darin, Vergleiche zwischen Variablen und Konstanten immer so herum zu schreiben daß die Konstante links steht. Also nicht
sondern besser
Wenn man dann nämlich statt "==" versehentlich "=" schreibt, wird aus der zweiten Variante
und dann gibt es nicht nur eine Warnung, sondern einen harten Fehler.
Gast
#6230672
Axel S. schrieb: > Aber es gab schon immer Regeln, wie Standardtypen in Wahrheitswerte > konvertiert werden. Und diese Regeln sind eindeutig und vernünftig. > Was einem numerischen Wert 0 entspricht, ist falsch; alle anderen > Werte ergeben wahr. Eben - ein direkter Vergleich eines Wertes mit 1 ("== 1") entspricht dann nicht unbedingt einem wahr, weil ein Wert von z.B. 2 genauso als true gelten, aber bei dem "== 1" Vergleich ein false liefern würde.
Gast
#6230826
Axel S. schrieb: > Also nichtif (x == 42) ... sondern besserif (42 == x) ... Wenn man dann > nämlich statt "==" versehentlich "=" schreibt, wird aus > der zweiten Varianteif (42 = x) ... und dann gibt es nicht nur eine > Warnung, sondern einen harten Fehler. In dem Moment wo du darüber nachdenkst, dass du beides umdrehst wird dir wohl kaum der Fehler passieren fälschlicherweise eine Zuweisung zu platzieren. Wenn es dir genauso gut passieren kann einfach = statt == zu verwenden wieso sollte es dir dann nicht auch passieren diese Verdrehung zu vergessen... Wolfgang schrieb: > Axel S. schrieb: >> Aber es gab schon immer Regeln, wie Standardtypen in Wahrheitswerte >> konvertiert werden. Und diese Regeln sind eindeutig und vernünftig. >> Was einem numerischen Wert 0 entspricht, ist falsch; alle anderen >> Werte ergeben wahr. > Eben - ein direkter Vergleich eines Wertes mit 1 ("== 1") entspricht > dann nicht unbedingt einem wahr Korrekt. Aber warum beginnst du den Satz mit "Eben"? Ich habe nirgendwo behauptet, der Vergleich mit 1 wäre korrekt (oder sinnvoll). Was der Compiler implizit macht, wenn er einen Ausdruck (x) in einen Wahrheitswert umwandelt ist das hier:
Er vergleicht mit 0 und negiert das Ergebnis. Msd schrieb: > Axel S. schrieb: >> nicht
>> sondern besser
>> Wenn man dann nämlich statt "==" versehentlich "=" schreibt, wird aus >> der zweiten Variante if (42 = x) ... und dann gibt es nicht nur eine >> Warnung, sondern einen harten Fehler. > > In dem Moment wo du darüber nachdenkst, dass du beides umdrehst wird dir > wohl kaum der Fehler passieren fälschlicherweise eine Zuweisung zu > platzieren. Wenn man sich das fest angewöhnt, bei Vergleichen immer die Konstante auf die linke Seite zu schreiben, dann muß man ja gerade nicht mehr darüber nachdenken. Die Operatoren "=" und "==" braucht man beide, da kann man sich keine feste Routine angewöhnen.
Gast
#6230920
Axel S. schrieb: > Korrekt. Aber warum beginnst du den Satz mit "Eben"? Weil genau das Problem des TO war, dass ein Vergleich "== 1" nicht einem true des davor stehenden Ausdrucks entspricht. Axel S. schrieb: > Also nicht > if (x == 42) ... sondern besser > if (42 == x) ... Gefällt mir - obwohl ich zu den Typen gehöre, die Warnungen anschalten und sie dann sogar lesen :-P Aber die Idee tue ich in meine Sammlung - Danke. Ikl schrieb: > Joachim B. schrieb: >> weil ein = kein Vergleich in C ist sondern eine Zuweisung! > > Aber das ist doch der Punkt. Durch die zuweisung ist es doch immer > erfüllt. Was soll denn dieses "es" sein, das da erfüllt ist? Msd schrieb: > In dem Moment wo du darüber nachdenkst, dass du beides umdrehst wird dir > wohl kaum der Fehler passieren fälschlicherweise eine Zuweisung zu > platzieren. Wenn es dir genauso gut passieren kann einfach = statt == zu > verwenden wieso sollte es dir dann nicht auch passieren diese Verdrehung > zu vergessen... Man denkt natürlich nicht jedes einzelne Mal darüber nach, sondern gewöhnt sich das an. Dann nimmt man es irgendwann gar nicht als Verdrehung war und macht das ganz automatisch so.
Gast
#6232327
Axel S. schrieb: > Wenn man sich das fest angewöhnt, bei Vergleichen immer die Konstante > auf die linke Seite zu schreiben, dann muß man ja gerade nicht mehr > darüber nachdenken. Rolf M. schrieb: > Man denkt natürlich nicht jedes einzelne Mal darüber nach, sondern > gewöhnt sich das an. Dann nimmt man es irgendwann gar nicht als > Verdrehung war und macht das ganz automatisch so. Wenn man sich an etwas neues gewöhnt, wieso kann man sich dann nicht gleich an das Grundproblem gewöhnen? Warum sich etwas neues ausdenken, wenn das das Problem noch nicht mal behebt. (Ja der Fehler ist zwar behoben wenn man auf den Compiler-Fehler reagiert aber das ist ja noch eine zweite Ebene). Der Ursprüngliche Fehler ist sogar zweistufig und sollte daher erstmal auf persönlicher Ebene behoben werden: 1. = und == zu verschludern (kann passieren) und nicht auf Warnungen zu reagieren/auszuschalten (kann nicht passieren). Msd schrieb: > Wenn man sich an etwas neues gewöhnt, wieso kann man sich dann nicht > gleich an das Grundproblem gewöhnen? Weil ein = anstelle eines == durchaus auch ein Tippfehler sein kann, den man nicht bemerkt. ;) Msd schrieb: > Der Ursprüngliche Fehler ist sogar zweistufig und sollte daher erstmal > auf persönlicher Ebene behoben werden: 1. = und == zu verschludern (kann > passieren) und nicht auf Warnungen zu reagieren/auszuschalten (kann > nicht passieren). Was meinst du wieviele Programme mit Warnings compiliert und benutzt werden? Das ist leider nicht sehr ungewöhnlich. Msd schrieb: > Rolf M. schrieb: >> Man denkt natürlich nicht jedes einzelne Mal darüber nach, sondern >> gewöhnt sich das an. Dann nimmt man es irgendwann gar nicht als >> Verdrehung war und macht das ganz automatisch so. > > Wenn man sich an etwas neues gewöhnt, wieso kann man sich dann nicht > gleich an das Grundproblem gewöhnen? Ich habe das getan. Mir passiert es eigentlich extrem selten, dass ich das zweite = vergesse, aber es ist schon vorgekommen - vielleicht auch nur, weil ich beim zweiten Druck auf die Taste etwas zu zaghaft war und es nicht angekommen ist. Ich hatte übrigens in der Firma mal eine Tastatur, die, wenn man die selbe Taste zweimal schnell hintereinander gedrückt hat, gerne mal den zweiten Tastendruck verschluckt hat. Ich vermute, die Entprellung war etwas zu "aggressiv" eingestellt. > Warum sich etwas neues ausdenken, wenn das das Problem noch nicht mal > behebt. (Ja der Fehler ist zwar behoben wenn man auf den Compiler-Fehler > reagiert aber das ist ja noch eine zweite Ebene). Es behebt den Fehler nicht, aber vermeidet ihn. > Der Ursprüngliche Fehler ist sogar zweistufig und sollte daher erstmal > auf persönlicher Ebene behoben werden: 1. = und == zu verschludern (kann > passieren) und nicht auf Warnungen zu reagieren/auszuschalten (kann > nicht passieren). Die Regel mit dem Tausch der Operanden stammt noch aus einer Zeit, als Compiler bei so was noch nicht gewarnt haben. Antwort schreibenBitte melde dich an, um einen Beitrag zu schreiben. |
Anzeige
|