Aus einem Dezimalwert Bits errechnen und werten.

  • VB.NET

Es gibt 32 Antworten in diesem Thema. Der letzte Beitrag () ist von DannyDee.

    Dein ganzer Quelltext ist eine einzige Frage.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Wenn du ein Problem damit hast oder eine Idee hast etwas besser zu machen, dann kannst du dies gerne sagen. Aber komm nicht mit so Meldungen.

    Wenn du Kritik hast, dann sprich. Wenn du nur flamen willst, dann lass es.
    SWYgeW91IGNhbiByZWFkIHRoaXMsIHlvdSdyZSBhIGdlZWsgOkQ=

    Weil einfach, einfach zu einfach ist! :D

    BiedermannS schrieb:

    VB.NET-Quellcode

    1. 'Das sind die Flags (Schalter) die deine Relais darstellen
    2. 'Links steht der Name, rechts der Wert (jeder wert ist der Wert des binären Stellenwerts von rechts nach links)
    3. Public Enum Relais
    4. _1 = 1 'Erstes Relais
    5. _2 = 2 'Zweites Relais usw...
    6. _3 = 4
    7. _4 = 8
    8. _5 = 16
    9. _6 = 32
    10. _7 = 64
    11. _8 = 128
    12. End Enum
    13. 'In diesem Dictionary wird eine Zuordnung von dem Wert im Enum Relais zum entsprechenden Button gespeichert
    14. 'also wenn das Dictionary mit Relais._1 aufgerufen wird, so greift man auf button1 zu, bei Relais._2 auf button2 usw...
    15. Private RefTable As New Dictionary(Of Relais, Windows.Forms.Button) From {{Relais._1, button1}, {Relais._2, button2}, {Relais._3, button3},
    16. {Relais._4, button4}, {Relais._5, button5}, {Relais._6, button6},
    17. {Relais._7, button7}, {Relais._8, button8}}
    18. Sub Main()
    19. 'In dieser Variable, wird der Dezimalwert gespeichert, der angibt welche Relais aktiviert sind.
    20. Dim r As New Relais
    21. 'Hier wird als Beispiel, der Wert für die Relais 2 5 und 7 in die variable gespeichert.
    22. 'durch das or werden die werte binär verknüpft
    23. r = Relais._2 Or Relais._5 Or Relais._7
    24. 'Diese Methode prüft, welche werte aktiv sind und setzt die Farben der Schalter dementsprechend
    25. 'r = der Dezimalwert der überprüft werden soll
    26. 'Relais._8 = der höchste Wert
    27. SetColors(r, Relais._8)
    28. 'man kann allerdings auch normale Ganzzahlen darin speichern
    29. r = 16
    30. SetColors(r, Relais._8)
    31. End Sub
    32. '''
    33. ''' Diese Methode prüft, welche werte aktiv sind und setzt die Farben der Schalter dementsprechend
    34. '''
    35. ''' der Dezimalwert der überprüft werden soll
    36. ''' der höchste Wert
    37. '''
    38. Public Sub SetColors(ByVal r As Relais, ByVal Max As Integer)
    39. 'bei diesem Wert beginnt die Schleife
    40. Dim enu As Relais = Relais._1 ' = 1
    41. 'Diese Variable, dient der Zählung der durchläufe und somit der Ermittlung der Binärstelle
    42. Dim counter As Integer = 1
    43. 'Die Schleife wird so lange durchlaufen, bis der aktuelle binärwert größer als der maximale wert ist (in diesem Fall Relais._8 also 128)
    44. Do Until enu > Max
    45. 'Ist der aktuelle Binärwert im Dezimalwert gesetzt (also das Relais aktiviert)
    46. If r.HasFlag(enu) Then
    47. 'Färbe den entsprechenden Button Grün ein
    48. RefTable(enu).BackColor = Color.Green
    49. 'sonst
    50. Else
    51. 'Färbe den entsprechenden Button Rot ein
    52. RefTable(enu).BackColor = Color.Red
    53. End If
    54. 'berechne den neuen Stellenwert und setze den counter auf die neue Stelle
    55. enu = 2 ^ counter
    56. counter += 1
    57. 'der Stellenwert berechnet sich beim binären wie folgt
    58. 'erste Stelle = 2 hoch 0 (muss nicht beachtet werden, da dies der ausgangszustand ist)
    59. 'zweite Stelle = 2 hoch 1
    60. 'dritte Stelle = 2 hoch 2
    61. 'vierte Stelle = 2 hoch 3
    62. 'darum wird der counter immer um 1 erhöht und der stellenwert mit 2 ^ counter berechnet
    63. Loop
    64. End Sub


    Wenn du noch Fragen hast, sag bescheid :)



    Also bei mir kommen da einige kleine Fehler auf... Habe es wie folgt mal dazugetippt :

    VB.NET-Quellcode

    1. Public Class Form1
    2. Public Enum Relais
    3. _0 = 1
    4. _1 = 2
    5. _2= 4
    6. _3 = 8
    7. _4 = 16
    8. End Enum
    9. Private RefTable As New Dictionary(Of Relais, Windows.Forms.Button){{Relais._0, cmd_rel0} , {Relais._1, cmd_rel1},{Relais._2 , cmd_rel2},{Relais._3 , cmd_rel3},{Relais._4 , cmd_rel4}
    10. Sub Main()
    11. Dim r As New Relais
    12. r = Relais._0 Or Relais._1 Or Relais._2 Or Relais._3 Or Relais._4
    13. SetColors(r, Relais._4)
    14. End Sub
    15. Public Sub SetColors(ByVal r As Relais, ByVal Max As Integer)
    16. Dim enu As Relais = Relais._1
    17. Dim counter As Integer = 1
    18. Do Until enu > Max
    19. If r.HasFlag(enu) Then
    20. RefTable(enu).BackColor = Color.Green
    21. Else
    22. RefTable(enu).BackColor = Color.Red
    23. End If
    24. enu = 2 ^ counter
    25. counter += 1
    26. Loop
    27. End Sub
    28. End Class


    Soweit so gut , dank deiner Erklärung hab ich das Prinzip (glaube ich zumindest) relativ verstanden. Aber ich muss jz nochmal den Unwissenden raushängen lassen und sagen ,dass mir bei

    VB.NET-Quellcode

    1. If r.HasFlag(enu) Then
    gesagt wird ,dass "HasFlag ist kein Member von AusleseTest.Form1.Relais"
    und
    bei

    VB.NET-Quellcode

    1. Private RefTable As New Dictionary(Of Relais, Windows.Forms.Button){{Relais._0, cmd_rel0} , {Relais._1, cmd_rel1},{Relais._2 , cmd_rel2},{Relais._3 , cmd_rel3},{Relais._4 , cmd_rel4}
    wird eine End Of erwartet.


    Wie kann ich diese Fehler beheben , und habe ich den Code richtig eingebunden?

    DannyDee schrieb:

    Wie kann ich diese Fehler beheben
    Indem Du VB2010 verwendest, wie das @BiedermannS: tut, der aber leider nicht gelesen hat, dass Du nur das Studio 2005 hast. :S
    Nimm einfach den Code, den ich Dir gepostet habe.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Sehr schade -.-' Da hab ichs mal verstanden und dann sowas! Naja okey... Dann werd ich deinen Code nutzen ,sofern ich ihn endlich kapiere. Scheint ja nicht schwer zu sein. Ich probiers mal aus , und schaue was dabei rumkommt.

    Edit by hal2000:
    - Vollzitat entfernt. Bitte in Zukunft vermeiden.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „hal2000“ ()

    DannyDee schrieb:

    VB.NET-Quellcode

    1. Private RefTable As New Dictionary(Of Relais, Windows.Forms.Button){{Relais._0, cmd_rel0} , {Relais._1, cmd_rel1},{Relais._2 , cmd_rel2},{Relais._3 , cmd_rel3},{Relais._4 , cmd_rel4}

    wird eine End Of erwartet.


    Hier fehlt ein } am ende

    RodFromGermany schrieb:

    Indem Du VB2010 verwendest, wie das @BiedermannS: tut, der aber leider nicht gelesen hat, dass Du nur das Studio 2005 hast. :S
    Nimm einfach den Code, den ich Dir gepostet habe.

    Rod's Code ist in dem Fall wohl besser, da er manche Funktionalitäten nicht benötigt und trotzdem funktioniert.

    @RodFromGermany: Ich warte trotzdem noch auf meine Kritik ;) Will ja wissen, was ich falsch mache...
    SWYgeW91IGNhbiByZWFkIHRoaXMsIHlvdSdyZSBhIGdlZWsgOkQ=

    Weil einfach, einfach zu einfach ist! :D

    BiedermannS schrieb:

    Will ja wissen, was ich falsch mache...
    Du versuchst das Problem der TEs vollständig zu lösen, das kann es ja wohl nicht sein.
    Du hilfst ihnen, wenn Du sie in die richtige Richtung dirigierst. Lernen müssen sie allein, und das geht nun mal nicht mit vollständigem C&P-Code.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Nun gut , aber bei

    VB.NET-Quellcode

    1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    2. Dim bits() As Integer = {1, 2, 4, 8, 16, 32, 64, 128}
    3. Dim result(7) As Integer
    4. Dim value As Integer = 7
    5. For i As Integer = 0 To 7
    6. If (value And bits(i)) = bits(i) Then
    7. result(i) = 1
    8. End If
    9. Next
    10. End Sub


    frage ich mich , wie ich die Farben zuweisen kann und welcher der Dim's der ausgelesene Wert ist , denn wenn ich das richtig verstanden habe sollte Value doch der Wert sein den ich auslese , und da ich per

    VB.NET-Quellcode

    1. readreg(shortadress as integer , register as integer)
    auslese müsste es doch in etwa so aussehen :

    VB.NET-Quellcode

    1. Private Sub cmd_read_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmd_read.Click
    2. tb_read.Text = readReg(20, 0)
    3. Dim bits() As Integer = {1, 2, 4, 8, 16, 32, 64, 128}
    4. Dim result(7) As Integer
    5. Dim value As Integer = readReg(20, 0)
    6. For i As Integer = 0 To 7
    7. If (value And bits(i)) = bits(i) Then
    8. result(i) = 1
    9. End If
    10. Next
    11. End Sub

    VB.NET-Quellcode

    1. tb_read.Text = readReg(20, 0)
    2. Dim value As Integer = readReg(20, 0)
    String = irgendwas
    Integer = das selbe irgendwas :?:
    Gib Deinem Programm bitte ganz schnell Option Strict On und behebe die Fehler.
    Nimm dam bitte die kürzere Variante mit dem Shift.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    du könntest, statt dem Result zu speichern (ausser du brauchst es noch öfter), gleich die farbe setzen.
    wurde hier auch schon mal erwähnt, wie man controls über den namen anspricht: me.controls("NameDesControls")

    @RodFromGermany: Ach so, dachte du meinst die Qualität des Codes....
    Ja ich weiß, ich bin manchmal hilfsbereiter als ich eigentlich sein sollte. :S
    SWYgeW91IGNhbiByZWFkIHRoaXMsIHlvdSdyZSBhIGdlZWsgOkQ=

    Weil einfach, einfach zu einfach ist! :D
    Wenn ich der Meinung bin,

    BiedermannS schrieb:

    die Qualität des Codes....
    ist suboptimal, dann schreibe ich "suboptimal" oder "Grütze" oder so. :D
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Iiiiiiiich gebe jetzt einfach mal auf ,was dieses Thema betrifft , bzw lege es auf Eis. Ich klopp mir erstmal die Grundlagen rein , übe etwas und arbeite mich Stück für Stück voran , sobald ich mit der Marterie vertraut bin können wir weiter reden. ;) Waidmanns Hail und nen schönen Arbeitstag an euch alle.