Autor Beitrag
sgssn
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Mi 12.06.13 16:34 
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++:

ausblenden C++-Quelltext
1:
2:
3:
4:
#define SWITCH1 1
#define SWITCH2 2
#define SWITCH3 4
#define SECURE  8   usw

dann
ausblenden 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

ausblenden 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

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mi 12.06.13 18:58 
Hallo Gerhard,

schau dir auch mal das FlagsAttribute an sowie die Enum-Methode HasFlag.

Ü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# oder aber dem Online-Tutorial Guide to C#.

Und bitte Crossposts immer angeben: myCSharp.de - C++ Umsteigerproblem ( auf Visual C# 2010 Express, WinForms).

P.S: @Ralf: ich finde, die Namen machen schon Sinn, damit man eben explizit einzelne Schalter der digitalen Karte ansprechen kann.
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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

ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: 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ß