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; //da steht jetzt der gelesen Port drin

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 user profile iconChristian 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)          
{
   // irgendwas tun wenn bit gesetzt
}


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.


Th69 - Mi 12.06.13 18:58

Hallo Gerhard,

schau dir auch mal das FlagsAttribute [http://msdn.microsoft.com/de-de/library/vstudio/system.flagsattribute.aspx] an sowie die Enum-Methode HasFlag [http://msdn.microsoft.com/de-de/library/system.enum.hasflag.aspx].

Übrigens fehlen bei deiner enum-Deklaration die Gleichheitszeichen (aber das wird dir der Compiler schon gesagt haben ;-)).

Auch wenn die Syntax von C++ und C# ähnlich ist, so sind doch manche Konzepte anders gelöst, d.h. du mußt dich schon mit den Eigenheiten von C# auseinandersetzen, am besten mit einem Buch, z.B. das OpenBook Visual C# [http://openbook.galileocomputing.de/visual_csharp_2012/] oder aber dem Online-Tutorial Guide to C# [http://www.guidetocsharp.de].

Und bitte Crossposts immer angeben: myCSharp.de - C++ Umsteigerproblem ( auf Visual C# 2010 Express, WinForms) [http://www.mycsharp.de/wbb2/thread.php?goto=lastpost&threadid=108403].

P.S: @Ralf: ich finde, die Namen machen schon Sinn, damit man eben explizit einzelne Schalter der digitalen Karte ansprechen kann.


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)) 
{
    // tu was   
}

bool PinChecked(byte pins, int pos)
{
   return (pins & (1 << (pos - 1))) > 0;   // nicht ausprobiert. Vermutlich nur fast richtig ;)
}


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ß