Fehlermeldung bei CharArray (Zufallsgenerator)

  • VB.NET

Es gibt 19 Antworten in diesem Thema. Der letzte Beitrag () ist von hundehausen.

    Fehlermeldung bei CharArray (Zufallsgenerator)

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub generieren_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles generieren.Click
    3. Randomize()
    4. Dim chart() As Char = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789".ToCharArray
    5. Dim pw As Integer = CInt(Int((chart * Rnd()) + 1))
    6. ergebnis.Text = pw
    7. End Sub
    8. End Class


    Die Fehlermeldung lautet:

    Der Wert vom Typ "1-dimensionales Array von Char" kann nicht in "Double" konvertiert werden.

    Markiert wird hier:

    Dim pw As Integer = CInt(Int((chart * Rnd()) + 1))


    Danke für eure Hilfe :)
    erstens ist chart ein array -> also nicht einfach mit chart anzusprechen sondern

    VB.NET-Quellcode

    1. chart(0)
    2. chart(1)

    zweitens ist char keine zahl d.h. du kannst nicht einfach damit multiplizieren

    lg
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten
    Du multiplizierst einen Array Chart mit einem Double-Wert rnd, da verzweifelt der Compiler etwas ;)

    Ausserdem:
    - verwende statt rnd lieber die Random-Klasse

    VB.NET-Quellcode

    1. dim r as new random ' nur 1x im Kopf der Form definieren
    2. ...
    3. dim zufallszahl as Integer = r.Next(untergrenze,obergrenze) ' beachte: obergrenze wird nie erreicht


    - initialisiere den Generator rnd nur 1x im Load Event, bzw definiere die Random Class im Kopf der Form

    - Du kannst statt Char Array auch nur einen String nehmen, der kann auch als Array angesprochen werden
    willst du ein passwort generieren?

    dann zB so:

    VB.NET-Quellcode

    1. Dim r As New Random
    2. Private Sub generieren_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles generieren.Click
    3. Dim chart() As Char = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789".ToCharArray
    4. Dim pw As String = Nothing
    5. For i As Integer = 0 To 5 'zB 6stelliges PW
    6. pw += chart(r.Next(0, 61))
    7. Next
    8. ergebnis.Text = pw
    9. End Sub
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten
    Hallo,

    du kannst das einfach so lösen:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim rnd As Random
    3. Dim liste As String = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
    4. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    5. rnd = New Random
    6. End Sub
    7. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    8. Me.TextBox1.Text = liste.Chars(rnd.Next(0, liste.Length))
    9. End Sub
    10. End Class


    So bekommst du einfach ein Random Char aus dem String.

    Ändernfalls, wenn ein Passwort generiert werden soll nimm die Lösung von fichz.

    Grüße
    Fillure
    Also in der Form wird in eine Textbox "a" die Anzahl der Zeichen eingegeben.

    Code:

    Dim a As Integer
    For i As Integer = 0 To a 'zB 6stelliges PW
    pw += chart(r.Next(0, 61))
    Next

    geht aber nicht, keine Fehlermeldung, es wird nur eine Zahl generiert.
    Hat jemand eine Idee?
    wenn a nicht mit werten befüllt wird ist es standardmässig 0
    mach

    VB.NET-Quellcode

    1. Dim a As Integer = CInt(Textbox.Text) 'Deine Textbox halt
    2. For i As Integer = 0 To a
    3. pw += chart(r.Next(0, 61))
    4. Next


    lg
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten
    Mein angepasster Code, damit man Zahlen dazu machen kann.

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim r As New Random
    3. Private Sub generieren_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles generieren.Click
    4. If zahlen.Checked = "True" Then
    5. Dim chart() As Char = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789".ToCharArray
    6. Dim pw As String = Nothing
    7. Dim a As Integer = CInt(anzahl.Text) 'Deine Textbox halt
    8. For i As Integer = 1 To a 'zB 6stelliges PW
    9. pw += chart(r.Next(0, 61))
    10. Next
    11. ergebnis.Text = pw
    12. End If
    13. If zahlen.Checked = "False" Then
    14. Dim chart() As Char = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".ToCharArray
    15. Dim pw As String = Nothing
    16. Dim a As Integer = CInt(anzahl.Text) 'Deine Textbox halt
    17. For i As Integer = 1 To a 'zB 6stelliges PW
    18. pw += chart(r.Next(0, 61))
    19. Next
    20. ergebnis.Text = pw
    21. End If
    22. End Sub


    Die Fehlermeldung lautet:
    pw += chart(r.Next(0, 61))
    Der Index war außerhalb des Arraybereichs.

    Hat jemand eine idee?
    Deine chart() Arrays haben eine unterschiedliche Länge, also kannst du auch nicht beide mit pw += chart(r.Next(0, 61)) bedienen. Die 61 mußt du anpassen.

    Ansonsten sollte dir auffallen, dass du im Grunde 2 x den gleichen Code geschrieben hast. das einzigste, was sich ändert ist das Array und halt die Zeichenanzahl, die du mit chart.count abfragen kannst.
    Also solltest du den Code in eine Function as String legen, die dir dein Passwort zurückgibt und als Parameter die boolsche variable (Alphanum oder Alpha) und die Anzahl der Stellen als Integer übernimmt.
    Fiel Fergnügen
    Vatter
    :thumbsup: Seit 26.Mai 2012 Oppa! :thumbsup:
    Bist du sicher, dass du weißt, was du bzw. der(dein) Code da machst?
    r.Next(0, 61): erzeugt eine Zufallszahl die einen ganzzahligen Wert von 0 bis 60 annehmen kann. Diesen Integerwert benutzt du, um ein Feld eines Arrays auszuwählen. er entspricht damit einer "Zeilennummer", die in dem Array bei 0 beginnt. Da das Alphabet (ohne Umlaute) idR 26 Großbuchstaben hat und meistens genauso viele Kleinbuchstaben, kann man davon ausgehen dass dashier: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" ungefähr 48 Zeichen sind, also Nummer 0-47.
    Mit deinem Code passiert jetzt folgendes: Wenn du jetzt bei einem Auto mit 5 Gängen versuchst in den 6. oder 7. zu schalten, kann es dir passieren, dass du den Rückwätsgang erwischst, verstanden?
    Das andere CharArray hat daher mit den Ziffern auch nur 58 Zeichen. Nun ist die Warscheinlichkeit, eine Zufallszahl zwischen 58 und 60 zu erhalten relativ gering, aber es passiert unter Umständen das gleiche wie oben.
    Darum: Sch... auf die 61 und nutze die Funktionen des Arrays (Count, Lenght oder so)
    :thumbsup: Seit 26.Mai 2012 Oppa! :thumbsup:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim r As New Random
    3. dim MaxWert as Integer
    4. Private Sub generieren_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles generieren.Click
    5. If zahlen.Checked = "True" Then
    6. Dim chart() As Char = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789".ToCharArray
    7. MaxWert = 61 ' Anzahl der Zeichen
    8. Else
    9. Dim chart() As Char = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".ToCharArray
    10. Maxwert = 51 ' Anzahl der Zeichen
    11. EndIf
    12. Dim pw As String = Nothing
    13. Dim a As Integer = CInt(anzahl.Text) 'Deine Textbox halt
    14. For i As Integer = 1 To a 'zB 6stelliges PW
    15. pw += chart(r.Next(0, MaxWert))
    16. Next
    17. ergebnis.Text = pw
    18. End Sub


    So haste die Abfrage nur für die Deklaration und musst deinen Code nicht doppelt schreiben.

    Mfg
    Yonda
    Hier ein par Berichtigungen zu Yondas Code:

    VB.NET-Quellcode

    1. Dim r As New Random 'Zufall instanzieren
    2. Function test(ByVal Anzahl As Integer, ByVal zahlen As Boolean) As String
    3. Dim chart() As Char 'die Deklaration muß vor der If-Anweisung erfolgen, damit die Variable weiter unten auch verfügbar ist
    4. If zahlen Then
    5. chart = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789".ToCharArray
    6. Else
    7. chart = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".ToCharArray
    8. End If
    9. Dim Passwort As String = ""
    10. For i As Integer = 1 To Anzahl 'zB 6stelliges PW
    11. Passwort &= chart(r.Next(0, chart.Length )) 'Zum Verknüpfen von text wird das &-Zeichen verwendet
    12. 'Mit chart.Length wird die Länge des Arrays ermittelt
    13. Next
    14. Return Passwort
    15. End Function
    16. 'Aufruf der Funktion
    17. Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
    18. TextBox1.Text = test(6, True)
    19. End Sub

    Damit kannst du variabel hantieren oder vielleicht weiter ausbauen (noch ein Char-Array mit Sonderzeichen?)
    Fiel fergnügen
    Vatter
    :thumbsup: Seit 26.Mai 2012 Oppa! :thumbsup:

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

    Vatter schrieb:

    ier ein par Berichtigungen zu Yondas Code

    Richtig. Allerdings muss ich jetzt noch eine kleine Berichtigung zu Deiner Berichtigung schreiben :rolleyes:

    Die Funktion Random.Next(Untergrenze, Obergrenze) ermittelt Integer Zufallszahlen zwischen Untergrenze und Obergrenze-1 (!), d.h. der oberste Wert wird nie erreicht.

    Also wäre hier tatsächlich richtig: Passwort &= chart(r.Next(0, chart.Length ))