Laden...

C++ Umsteigerproblem: #defines umsetzen und Bitwerte abfragen

Erstellt von sgssn vor 10 Jahren Letzter Beitrag vor 10 Jahren 1.283 Views
Thema geschlossen
S
sgssn Themenstarter:in
6 Beiträge seit 2013
vor 10 Jahren
C++ Umsteigerproblem: #defines umsetzen und Bitwerte abfragen

Hallo

schreibe gerade an meinem ersten C#-Programm und falle 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++:

#define SWITCH1 1
#define SWITCH2 2
#define SWITCH3 4
#define SECURE 8 usw

dann:

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 definiert

enum PORT1BITS : byte
{
   SWITCH1 1,
   SWITCH2 2,
   SWITCH3 4,
   SWITCH4 8,
   SECURE   0x10
};

und wenn ich jetzt schreibe

if( di & PORT1BITS.SWITCH1 )

meckert der Compiler ich könnte '&' nicht mit Bool und int verwenden 😦

Wie mach ich das richtig?
Gruß
Gerhard

A
31 Beiträge seit 2009
vor 10 Jahren

Hallo,

die Bit-Werte kannst du mit der (Enum.HasFlag Method) abfragen. Im Link findest du auch ein Beispiel.

Viele Grüße

309 Beiträge seit 2008
vor 10 Jahren

Genau, Enum.Has Flag verweden!

Noch ne kurze Erklärung zu der Fehlermeldung:
Weil C# im if einen boolschen Wert erwartet.
In C (C++ schleppt die Altlasten ja mit) gibt's ja kein bool. Im if wird einfach jeder wert ungleich 0 als wahr ausgewertet.

Wenn du das C Verhalten nachbilden willst:


if( di & PORT1BITS.SWITCH1 != 0)

Aber besser Enum.Has Flag verweden!

using System;class H{static string z(char[]c){string r="";for(int x=0;x<(677%666);x++)r+=c[
x];return r;}static void Main(){int[]c={798,218,229,592,232,274,813,585,229,842,275};char[]
b=new char[11];for(int p=0;p<((59%12));p++)b[p]=(char)(c[p]%121);Console.WriteLine(z(b));}}

T
2.224 Beiträge seit 2008
vor 10 Jahren

Anbei beherrscht C++ auch enums und das schon seit ich mit C++ aktiv aufgehört habe vor rund 3-4 Jahren 😉

Mit Makros zu arbeiten ist in diesem Fall mehr C als C++
Enums solltest du eher nutzen als #define
Makros sind nur zur Textersetzung gedacht und auch mehr C als C++.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

Hinweis von herbivore vor 10 Jahren

Bitte schnapp dir ein gutes C# Buch und eigene dir zunächst die Grundlagen selbst an, bevor du hier im Forum Fragen stellt. Bitte beachte [Hinweis] Wie poste ich richtig? Punkt 1.1.1 und schau auch mal in [FAQ] Wie finde ich den Einstieg in C#?

Thema geschlossen