Entwickler-Ecke
Basistechnologien - C++ Umstiegsproblem auf Visual C# 2010, WinForms
sgssn - Mi 12.06.13 16:34
Titel: C++ Umstiegsproblem auf Visual C# 2010, WinForms
Hallo
schreibe gerade an meinem ersten C#-Programm und falls dauernd auf die Nase. Aktuelles Problem:
Ich lese eine Digitale Karte ein und möchte wissen, ob Bit 0, 1, 2 usw gesetzt sind. ich möchte den Bits auch Namen geben.
Beispiel
bisher in C++:
C++-Quelltext
1: 2: 3: 4:
| #define SWITCH1 1 #define SWITCH2 2 #define SWITCH3 4 #define SECURE 8 usw |
dann
C++-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| int di; if( di & SWITCH1 ) { irgendwas } if( di & SWITCH2 ) { was anderes } |
Defines kann ich in Visual C# Express 2010 gar nicht verwenden, da kommt ne Fehlermeldung ich müsste das vor irgendwas verwenden, kann ich nix damit anfangen
jetzt hab ich ein Bitfeld dfiniert
C#-Quelltext
1: 2: 3: 4: 5: 6: 7:
| enum PORT1BITS : byte { SWITCH1 1, SWITCH2 2, SWITCH3 4, SWITCH4 8 }; |
und wenn ich jetzt schreibe
C#-Quelltext
1:
| if( di & PORT1BITS.SWITCH1 ) |
meckert der Compiler ich könnte '&' nicht mit Bool und int verwenden :-(
Wie mach ich das richtig?
Gruß
Gerhard
Moderiert von
Christian S.: C#-Tags hinzugefügt
Ralf Jansen - Mi 12.06.13 18:27
Zitat: |
meckert der Compiler ich könnte '&' nicht mit Bool und int verwenden :-( |
Der Ausdruck im if muß einen Bool ergeben das Ergebnis von "int & int" ist aber natürlich weiterhin ein int und kein bool. Du solltest also im if prüfen ob das Ergebnis des bitweisen UND gleich/ungleich 0 ist.
Also
C#-Quelltext
1: 2: 3: 4:
| if((di & PORT1BITS.SWITCH1) != 0) { } |
Wenn die Namen der bits keinen wirkliche Bedeutung haben den man im Namen unterbringt finde ich es denen Namen zu geben aber irgendwie überflüssig (oder füllt sich der Name für mich nur generisch an?).
Anstatt einem Enum kannst du aber auch genauso einen Sack Konstanten nehmen.
Ralf Jansen - Mi 12.06.13 19:39
Zitat: |
P.S: @Ralf: ich finde, die Namen machen schon Sinn, damit man eben explizit einzelne Schalter der digitalen Karte ansprechen kann. |
Wenn der Name aber nichts weiter aussagt als 1.ter Pin dann kann man doch eher auch den Wert 1 benutzen? Das empfinde zumindest ich als sprechender ;)
Aka
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| if(PinChecked(di, 4)) { }
bool PinChecked(byte pins, int pos) { return (pins & (1 << (pos - 1))) > 0; } |
sgssn - Mi 12.06.13 19:53
Hallo
danke für die Posts.
Literatur hab ich eigentlich schon, sind aber wohl nicht so ganz doll:Visual C# 2010 von D.Frischalowski und gleicher Titel von D.Louis.
Vielleicht steht das ja sogar in einem der Bücher, aber dann musst du auch erst mal wissen, wonach du suchen musst.
Morgen probier ich die Vorschläge aus. Werd das schon schaffen :-)
Gruß
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!