Gast
#2317938
Hallo habe einen Code von einem Kollegen bekommen den ich nicht verstehe kann mir jemand weiter helfen? Hier ist der Code:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
EventType ist ein enum das bis 56 geht.
|
Anzeige
|
Kann mir jemand diesen Code erklären?
Gast
#2317938
Hallo habe einen Code von einem Kollegen bekommen den ich nicht verstehe kann mir jemand weiter helfen? Hier ist der Code:
EventType ist ein enum das bis 56 geht.
Gast
#2317940
warum fragst du deinen Kollegen nicht? Bei welcher Zeile kommt du denn nicht weiter?
Gast
#2317945
Weil mein Kollege für 3 Wochen im Urlaub ist und ich mich nun in seine Sachen einarbeiten soll. Moin Andi80, in ActualEvents, das aus zwei 32bit-Zahlen besteht, wird das Bit gelöscht, das die Nummer der Eventcodes hat. ActualEvents[1] ist für die Bits 55..32 zuständig, [0] für 31..0. Gruß Jens
Gast
#2317962
Ok das mit dem ersten Teil habe ich verstanden aber den Teil hinter der Klammer nicht ganz.Wie würde das ganze aussehen wenn ich es in mehreren Schritten mach? Hinter welcher Klammer? Mal die Kernzeile: ActualEvents[ EventCode >> 5] &= ~(1UL<<(EventBit(EventCode)) Könnte man als
schreiben. Wird das so klarer?
Gast
#2317990
Lies mal hier nach: http://www.mikrocontroller.net/articles/Bitmanipulation Oliver
Gast
#2318028
Alles klar super jetzt habe ich es verstanden. Besten dank. Hallo Andi, tu Dir bitte selbst den Gefallen und klammere das a in dem #define noch zusätzlich ein. Sonst hängt die Evaluierung des ganzen von der Operatorrangfolge in C ab, was spätestens beim unteren Beispiel danebengeht, da der "?:"-Operator schwächer bindet als das "&". Genau dieser Fehler eines Experten hat mich Stunden meines Lebens gekostet.
Grüße, Tom Tom K. schrieb: > tu Dir bitte selbst den Gefallen und klammere das a in dem #define noch > zusätzlich ein. > #define EventBit(a) (a&0x1F) Du bist aber dann hoffentlich gleich noch einen Schritt weiter gegegangen und hast noch eine zusätzliche Klammerebene eingezogen?
Hallo Karl Heinz, ich schon, aber der Kollege von Andi anscheinend nicht. Das Beispiel sollte demonstrieren, was passieren kann, wenn man die Klammern weglässt. Das habe ich nicht deutlich genug beschrieben. Wie man an der Ausgabe sieht, ist das einzige, was mit 0x1F maskiert wird, die defaultForUneven-Variable:
Grüße Tom K. schrieb: > Hallo Karl Heinz, > > ich schon, aber der Kollege von Andi anscheinend nicht. Das Beispiel > sollte demonstrieren, was passieren kann, wenn man die Klammern > weglässt. Ah, ok. Passt. Ich war schon etwas in Eile und hab mir das Beispiel nicht näher angesehen. Mein Standardbeispiel für diesen Fehlertypus sieht so aus #define TIMES2(x) 2*x j = TIMES2( 3 + 2 ) aus dem Code würde man beim schnellen Lesen ein Ergebnis von 10 erwarten. Tatsächlich ist das Ergebnis aber 8 Warum? Weil die Makroersetzung zu j = 2*3 + 2 führt, und das was anderes ergibt als j = 2*(3 + 2) so wie es ursprünglich gedacht war. #define TIMES2(x) (2*(x)) In Makros kann man fast nie genug Klammern haben. Und selbst dann ... Antwort schreibenBitte melde dich an, um einen Beitrag zu schreiben. |
Anzeige
|