Hi ich habe ein kleines Problem bei C# und zwar wollte ich eine Variable vom Datentyp Byte überprüfen. Die Variable befindet sich in einer Klasse. Wenn ich allerdings versuche in einer If-Abfrage das die erste Stelle des Bytes zu überprüfen also: if(globalVar._Byte[0] & 0x01){} kommt immer eine Fehlermeldung. Könnt ihr mir vielleicht sagen was ich falsch gemacht habe? Oder sagen wie ich es richtig mache? ich habe vor das ganze Byte abzufragen also jede der 8 Stellen. Bisher kenne ich das nur als Und-Verknüpfung. Gruß
Welche Meldung kommt denn? Wenn ich z.B. "if ((this.test & 0x01) > 0)" schreibe gehts.
bän schrieb: > if(globalVar._Byte[0] & 0x01){} kommt immer eine Fehlermeldung. Wieso _Byte[0]? ist das ein array? Gruss Reinhard
Es wäre vielleicht auch hilfreich zu wissen was für eine Fehlermeldung kommt... Ich vermute das 0x01 vom Compiler als Int32 Konstante interpretiert wird und das nicht klappt weil globalVar._Byte[0] vom Typ byte ist. Ein cast sollte das beheben.
Reinhard Kern schrieb: > bän schrieb: >> if(globalVar._Byte[0] & 0x01){} kommt immer eine Fehlermeldung. > > Wieso _Byte[0]? ist das ein array? > > Gruss Reinhard Da hat er recht! Du kannst die Bits zB. so abfragen:
1 | public delegate TResult Func<TArg0, TResult>(TArg0 arg0); |
2 | public delegate TResult Func<TArg0, TArg1, TResult>(TArg0 arg0, TArg1 arg1); |
3 | |
4 | static void Main(string[] args) |
5 | {
|
6 | Func<byte,bool> quest = x => (x & 0x1) == 0x1; |
7 | Func<byte,byte,bool> quest2 = (x,y) => (x & 1 << y) >= 1; |
8 | for(byte i = 0x0; i < 0x10; i++) // Bit 0 gesetzt beo 0 bis 9? |
9 | Console.WriteLine(string.Format("{0} : {1}",i,quest(i))); |
10 | |
11 | for (byte i = 0; i < 8; i++) // Welche stellen bei 0x11 ? |
12 | Console.Write(string.Format("{0} : ", quest2(0x11, i))); |
13 | |
14 | Console.Read(); |
15 | }
|
Hallo das kommt daher das C# stark typisiert ist, eine If Abfrage verlangt eine Boolschen Wert. Wenn du 2 ints mit & kombinierst kommt als Ergebnis wieder ein int heraus. Deshalb musst du es so schreiben: if ((this.test & 0x01) > 0) Womit du aus dem int ein bool machst fz
Also ich will ein Byte durch einen Tastendruck oder Loslassen der Taste verändern. Es gibt 8 mögliche Tasten und die verändern also jeweils ein Bit im Byte. Das Byte wird hinterher über die Serielle Schnittstelle mit der Funktion Write(); versendet. Ich habe mich für ein Byte Array entschieden, weil ich ja keinen String mit dem Mikrocontroller auslesen will sondern nur ein einziges Byte verschicken will. Die Funktion Write bietet auch die Möglichkeit ein Byte-Array zu versenden und das kam meinen Vorstellungen am nächsten. Vielleicht könnt ihr mir ja sagen was ich genau falsch mache. Also die Klasse in der das Byte-Array ist sieht so aus:
1 | public static class globalVar |
2 | {
|
3 | public static SerialPort Port; |
4 | public static byte[] Tastenkombination = { 0 }; |
5 | }
|
Hier ist das KeyDown-Event das KeyUp-Event sieht ebenfalls so aus:
1 | private void Form1_KeyDown(object sender, KeyEventArgs e) |
2 | {
|
3 | if (e.KeyData == Keys.Up) |
4 | {
|
5 | globalVar.Tastenkombination[0] ^= 0x08; |
6 | }
|
7 | globalVar.Port.Write(globalVar.Tastenkombination[0].ToString()); |
8 | }
|
Jetzt will ich in der Abfrage der Taste noch einbringen ob die Taste nicht schon den Wert geändert hat und dachte mir ich kann einfach mit "& 0x08" das Byte vergleichen und erhalte dementsprechend true oder false. Wie mache ich diese Abfrage denn sinnvoll und richitg? Ist es für das Senden mit der Seriellen Schnittstelle von Bedeutung ob es jetzt ein String ist oder ein Byte als Datentyp? Für einen kleinen Test im Hypterterminal habe ich einfach mal die Funktion .ToString(); verwendet. Gruß Bän
bän schrieb: > Wie mache ich diese Abfrage denn sinnvoll und richitg? Wie wäre es mit LESEN ? Ich sehe auf Anhieb zwei Lösungen die genau diese Frage beantworten!
Es sollte heißen:
1 | if ((this.test & 0x01) == 0x01) |
Für deinen Fall geht es auch mit "> 0" aber wenn du nicht nur ein Bit prüfen willst, musst du genau mit dem zu prüfenden Wert vergleichen.
@bän Steht doch alles in meinem Beispiel! Manchmal hilft auch ein Blick in die Sprach-Standards. Gerade die MSDN lässt sich da gut aus. Aber ohne grundlegendes Wissen über die gewählte Sprache wirst Du auch mit allen Beispielen im Trüben fischen. Da musst Du halt durch ...
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.