Keine Mehrfachen For Next schleifen möglich

  • VB.NET

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von SpaceyX.

    Keine Mehrfachen For Next schleifen möglich

    Hallo... folgender Code führt leider nur eine "for ... to" schleife aus und die zweite wird garnicht ausgeführt..
    Nicht einmal eine messagebox wird angezeigt sollte ich sie direkt hinter das "next"...

    Hier der Code:

    VB.NET-Quellcode

    1. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    2. '// Pokemon Liste Anlegen
    3. Dim pokemonList() As String = System.IO.File.ReadAllLines(Application.StartupPath & "\config\pokemonList.txt")
    4. For i As Integer = 0 To pokemonList.Length()
    5. Dim zeroAdd As String = ""
    6. Dim pkmNumber = i + 1
    7. If pkmNumber.ToString.Length() = 1 Then
    8. zeroAdd = "00"
    9. ElseIf pkmNumber.ToString.Length() = 2 Then
    10. zeroAdd = "0"
    11. Else
    12. zeroAdd = ""
    13. End If
    14. pk01_pokemonList.Items.Add(zeroAdd & (i + 1) & " " & pokemonList(i))
    15. pk02_pokemonList.Items.Add(zeroAdd & (i + 1) & " " & pokemonList(i))
    16. Next
    17. '// Geschlechter Anlegen
    18. Dim pokemonGender() As String = {"?", "?", "?"}
    19. For i As Integer = 0 To pokemonGender.Length()
    20. pk01_gender.Items.Add(pokemonGender(i))
    21. pk02_gender.Items.Add(pokemonGender(i))
    22. Next
    23. pk01_gender.Text = pokemonGender(0)
    24. pk02_gender.Text = pokemonGender(0)
    25. End Sub


    Einzeln funktionieren sie einwand frei! (es funktioniert auch NICHT über 2 Subs!)

    Gerne lasse ich mich auf fehler hinweisen! Und ob ich etwas verbessern könnte ;)
    z.B. das mit den "0" hinzufügen vor den zahlen.

    Mfg. Benhero

    Benhero schrieb:

    z.B. das mit den "0" hinzufügen vor den zahlen.
    ->

    VB.NET-Quellcode

    1. For i As Integer = 0 To pokemonList.Length() - 1
    2. Dim s As String = String.Join(" ", (i + 1).ToString("000"), pokemonList(i))
    3. pk01_pokemonList.Items.Add(s)
    4. pk02_pokemonList.Items.Add(s)
    5. Next
    Beachte auch, dass du bei allen Schleifen ein -1 dazusetzen musst, so wie ich es hier gemacht habe.
    Was meinst du?
    Der Index ist nullbasiert, du willst aber bei 1 anfangen, deswegen musst du vor der Konvertierung in einen String eins dazuzählen, so wie dus jetzt auch schon machst.
    Beim ToString hab ich einfach noch nen Formatstring angegeben, der besagt, dass immer drei Stellen ausgegeben werden sollen. Ist die Zahl keine drei Stellen lang, wird auf drei Stellen mit Nullern aufgefüllt.
    dann sollte ja

    VB.NET-Quellcode

    1. For i As Integer = 0 To pokemonList.Length()
    2. Dim s As String = String.Join(" ", (i + 1).ToString("000"), pokemonList(i))
    3. pk01_pokemonList.Items.Add(s)
    4. pk02_pokemonList.Items.Add(s)
    5. Next


    auch gehen :?

    Mfg. Dereta
    Das Problem ist ganz einfach: Dein Array "pokemonList" ist x Elemente groß. Das erste ELement hat Index 0, das letzte Element hat Index... nein, nicht x, sondern x-1. Bei 9 Strings also die Indizes 0 bis 8. Bei deiner zweiten Schleife genauso... das Array hat 3 Elemente, du gehst aber mit deiner For-Schleife von 0 bis 3. Das sind 4 Elemente.

    Was passiert? Deine Schleife läuft durch, es sieht für dich so aus, als sei alles ok, bis der Index von i das Element x erwischt, das in deinem Array nicht mehr existiert. Das löst eine IndexOutOfRange Exception aus. Da das ganze in deine Form_Load Methode passiert, muss man bedenken, dass Exceptions in Form_Load vom Programmstarter (ich nenn ihn mal so), also vom Framework abgefangen werden, ohne dass du das mitbekommst. Die Exception wird also außerhalb der Prozedur auf einer höheren Ebene abgefangen, der Rest von Form_Load wird gar nicht mehr ausgeführt. Darum wird jede For-Schleife für sich selbst auch scheinbar korrekt ausgeführt, hast du beide in der Funktion, merkst du aber, dass die zweite eben nicht mehr erreicht wird.

    Das ist das ganze Mysterium.
    Weltherrschaft erlangen: 1%
    Ist dein Problem erledigt? -> Dann markiere das Thema bitte entsprechend.
    Waren Beiträge dieser Diskussion dabei hilfreich? -> Dann klick dort jeweils auf den Hilfreich-Button.
    Danke.
    Das -1 hat damit gar nichts zu tun. Arrayindizes sind nullbasiert, was bedeutet, dass der höchste Index im Array immer eins niedriger ist als die Länge des Arrays. Hast du z.B. ein Array der Länge 10, dann ist der höchste Index in diesem Array 9.

    Arby schrieb:

    Das ist das ganze Mysterium.


    Wäre ein Leichtes gewesen, einen Haltepunkt zu setzen. Dies setzt natürlich voraus, dass man sein Werkzeug kennt.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    okay.. noch etwas.. wo ich vermute das es schneller geht...

    VB.NET-Quellcode

    1. Dim pokemonNumber() As String = pk02_pokemonList.Text.Split("-")
    2. Dim pokemonGen As String = ""
    3. If pokemonNumber(0) <= 151 Then
    4. pokemonGen = "1"
    5. ElseIf pokemonNumber(0) <= 251 Then
    6. pokemonGen = "2"
    7. ElseIf pokemonNumber(0) <= 386 Then
    8. pokemonGen = "3"
    9. ElseIf pokemonNumber(0) <= 493 Then
    10. pokemonGen = "4"
    11. ElseIf pokemonNumber(0) <= 649 Then
    12. pokemonGen = "5"
    13. Else
    14. pokemonGen = "6"
    15. End If


    Kann man das irgendwie kürzen :?

    Mfg. Benhero
    #erledigt...

    habe es über eine Funktion geregelt..

    VB.NET-Quellcode

    1. Function pokemonGetGen(ByVal pokemonNumber As Integer) As String
    2. Dim pokemonGen As String = ""
    3. If pokemonNumber <= 151 Then
    4. pokemonGen = "1"
    5. ElseIf pokemonNumber <= 251 Then
    6. pokemonGen = "2"
    7. ElseIf pokemonNumber <= 386 Then
    8. pokemonGen = "3"
    9. ElseIf pokemonNumber <= 493 Then
    10. pokemonGen = "4"
    11. ElseIf pokemonNumber <= 649 Then
    12. pokemonGen = "5"
    13. Else
    14. pokemonGen = "6"
    15. End If
    16. Return pokemonGen
    17. End Function
    Wenn Du ein Ergebnis gefunden hast, ist es anzuraten, dass Du dann auch das Ergebnis zurücklieferst und die Funktion verlässt. Ansonsten verschwendest Du Rechenzeit, obwohl das Resultat ja klar ist:

    VB.NET-Quellcode

    1. Function pokemonGetGen(ByVal pokemonNumber As Integer) As String
    2. Select Case pokemonNumber
    3. Case Is <= 151
    4. Return "1"
    5. Case Is <= 251
    6. Return "2"
    7. Case Is <= 386
    8. Return "3"
    9. Case Is <= 493
    10. Return "4"
    11. Case Is <= 649
    12. Return "5"
    13. Case Else
    14. Return "6"
    15. End Select
    16. End Function
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o