Fehler im Array vergrössern und befüllen

  • VB.NET

Es gibt 18 Antworten in diesem Thema. Der letzte Beitrag () ist von Kirohn.

    Fehler im Array vergrössern und befüllen

    Hallo

    Ich habe eine Frage wegen mein neues Projekt.

    Ich habe ein Array, die ich befüllen möchte. Leider klappt es nicht. Was ist falsch an diesem Code?

    VB.NET-Quellcode

    1. Dim arrLaenge As Integer = punkte.Length
    2. Dim newPunkt As New PointF(offsetX + laenge1, offsetY)
    3. currentPositionX = offsetX + laenge1
    4. currentPositionY = offsetY
    5. ReDim Preserve punkte(arrLaenge + 1)
    6. punkte(arrLaenge) = newPunkt


    punkte ist ein Array mit dem Datentyp PointF
    currentPositionX ist ein Integer
    currentPositionY ist ein Integer
    offsetX ist ein Integer
    offsetY ist ein Integer
    laenge1 ist ein Intege

    Der Code, den ich geschickt habe, ist der, der fehlschlägt
    :cursing: Leute, gewöhnt Euch an konkret zu werden! Was soll das heißen?

    Kirohn schrieb:

    Leider klappt es nicht.
    Ergebnis anders als erwartet? Fehlermeldung (Wenn ja, dann Codezeile und genauen Wortlaut)? PC explodiert?

    Mach mal in Zeile#5 das + 1 weg, damit keine Lücken im Array entstehen. Falls das das Problem ist. Oder nimm eine List(Of PointF) statt einem Array, dann kannst Du einfach mit DeineListe.Add(newPunkt) arbeiten. Und später ggf. mit DeineListe.ToArray ein Array erhalten, falls das an irgendeiner Stelle erwartet wird.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    @VaporiZed
    Tut mir leid für die unkonkretheit. :( :/

    Habs gemacht. Das Array hat plötzlich nur noch 1 Wert drin und das ist der aktuelle. Alle anderen waren gelöscht.

    Hab es jetzt aber mit der Liste gemacht und das hat funktioniert. Danke

    Kirohn schrieb:

    Alle anderen waren gelöscht.
    Ich würde mal sagen, die waren nie befüllt, wenn der Code oben komplett ist.
    Manchmal hilft es, zu debuggen und das Programm Zeile für Zeile durch zu steppen:
    Debuggen, Fehler finden und beseitigen
    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!
    @ErfinderDesRades In seinem Code wird augenscheinlich nur ein Element befüllt.
    Ansonsten fehlt wesentlicher 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!
    @RodFromGermany und @ErfinderDesRades

    Es ist nur ein Code-Schnipsel, nichts weiteres. Klar ist es nicht der ganze Code. Ich werde auch nicht den ganzen Code schicken, weil es nicht gerade wenig ist. Dieser Code, dass ich geschickt habe, ist einfach der Bereich, wo mir der Fehler auffiel

    laenge1 ist auch nicht das Problem. Es ist eine Benutzereingabe, die ich nachher zu einem Integer konvertiert habe.
    @HenryV
    Leider hab ich das auch ausgetestet, aber es funktionierte nicht.
    Aber ich konnte es vor kurzem lösen, indem ich dem Array eine feste Grösse gab und dann sie so füllte.

    Ich weiss wie viel ich maximal reinspeichere, also macht das keine Rolle, ob die Grösse festgelegt ist oder nicht. Aber leider stecke ich jetzt irgendwo anders fest.

    Wenn ich versuche diese Zeile Code auszuführen:

    VB.NET-Quellcode

    1. g.DrawLines(myPen, punkte)

    Dann gibt es einen Fehler, der besagt:
    Ungültiger Parameter

    Was ich daran nicht verstehe ist, dass die Parameter den Vorgaben entsprechen.

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

    @Kirohn Dann teste vorher in einem separaten kleinen Projekt, dass der Fehler / Effekt auch tatsächlich reproduziert wird. Und diesen Code poste dann.
    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!
    @RodFromGermany
    Es ist ein seperates Projekt. Ich wollte so viel nicht sagen, weil es nichts mit dem Problem allgemein zu tun hat, aber ich glaube es ist Zeit dafür.

    Der Benutzer hat eine Tabelle, in der er 4 Längen und 3 Winkel eingeben kann. Danach soll das Programm durch einen Knopfdruck das ganze zeichnen.
    Ich berechne, falls es einen Winkel hat, mit Sinus und Cosinus die Endpositionen der Linien und adde diese Positionen nacheinander dem Array hinzu.
    Danach soll es das zeichnen.

    Ach und welchen Code meinst du?

    VB.NET-Quellcode

    1. ​Imports System.Drawing.Drawing2D
    2. Public Class Form1
    3. Private GlobaleE As PaintEventArgs = Nothing
    4. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    5. Try
    6. Dim g As Graphics
    7. g = GlobaleE.Graphics
    8. Dim offsetX As Integer = 419
    9. Dim offsetY As Integer = 502
    10. Dim currentPositionX As Integer
    11. Dim currentPositionY As Integer
    12. Dim laenge1 As Integer
    13. If (txtLaenge1.Text = "") Then laenge1 = 0 Else laenge1 = Convert.ToInt32(txtLaenge1.Text)
    14. Dim laenge2 As Integer
    15. If (txtLaenge2.Text = "") Then laenge2 = 0 Else laenge2 = Convert.ToInt32(txtLaenge2.Text)
    16. Dim laenge3 As Integer
    17. If (txtLaenge3.Text = "") Then laenge3 = 0 Else laenge3 = Convert.ToInt32(txtLaenge3.Text)
    18. Dim laenge4 As Integer
    19. If (txtLaenge4.Text = "") Then laenge4 = 0 Else laenge4 = Convert.ToInt32(txtLaenge4.Text)
    20. Dim winkel1 As Integer
    21. If (txtWinkel1.Text = "") Then winkel1 = 0 Else winkel1 = Convert.ToInt32(txtWinkel1.Text)
    22. Dim winkel2 As Integer
    23. If (txtWinkel2.Text = "") Then winkel2 = 0 Else winkel2 = Convert.ToInt32(txtWinkel2.Text)
    24. Dim winkel3 As Integer
    25. If (txtWinkel3.Text = "") Then winkel3 = 0 Else winkel3 = Convert.ToInt32(txtWinkel3.Text)
    26. Dim myPen As New Pen(Color.Black, 5)
    27. Dim punkte(4) As PointF
    28. punkte(0) = New PointF(offsetX, offsetY)
    29. If laenge1 = Nothing Or laenge1 = 0 Then
    30. MessageBox.Show("Bitte geben Sie die erste Länge ein!")
    31. Exit Sub
    32. Else
    33. Dim arrLaenge As Integer = punkte.Length
    34. Dim newPunkt As New PointF(offsetX + laenge1, offsetY)
    35. currentPositionX = offsetX + laenge1
    36. currentPositionY = offsetY
    37. punkte(1) = newPunkt
    38. End If
    39. If laenge2 = Nothing Or laenge2 = 0 Then
    40. Else
    41. If winkel1 = Nothing Or winkel1 = 0 Then
    42. Dim arrLaenge As Integer = punkte.Length
    43. Dim newPunkt As New PointF(currentPositionX + laenge2, currentPositionY)
    44. currentPositionX = currentPositionX + laenge2
    45. currentPositionY = currentPositionY
    46. punkte(2) = newPunkt
    47. Else
    48. Dim arrLaenge As Integer = punkte.Length
    49. Dim a As Integer = 0
    50. Dim b As Integer = 0
    51. a = Math.Round(laenge2 * Math.Cos(winkel1), 0)
    52. b = Math.Round(laenge2 * Math.Sin(winkel1), 0)
    53. Dim newPunkt As New PointF(currentPositionX + b, currentPositionY + a)
    54. currentPositionX = currentPositionX + b
    55. currentPositionY = currentPositionY + a
    56. punkte(2) = newPunkt
    57. End If
    58. End If
    59. myPen.StartCap = LineCap.Square
    60. myPen.EndCap = LineCap.Square
    61. myPen.LineJoin = LineJoin.Round
    62. g.DrawLines(myPen, punkte.ToArray)
    63. MyBase.OnPaint(GlobaleE)
    64. Catch ex As Exception
    65. End Try
    66. End Sub
    67. Private Sub PictureBox1_Paint(sender As Object, e As PaintEventArgs) Handles PictureBox1.Paint
    68. Try
    69. GlobaleE = e
    70. Catch ex As Exception
    71. End Try
    72. End Sub
    73. End Class

    Bitte nicht auf die sauberkeit des Codes schauen
    @Kirohn Was sollen wir nun damit machen?
    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!
    @Kirohn Du hast einen Effekt, den wir, wenn möglich, aufklären sollen.
    OK.
    Ich füge Deinen Code in ein leeres Projekt mir Button und PictureBox sowie 7 TextBoxen ein.
    Effekt klar: Machst Du Option Strict On :!:
    Visual Studio - Empfohlene Einstellungen
    Statt der TextBoxen nimmst Du lieber NumericUpDown-Controls, denn wenn ich in die TextBoxen schreibe "Roulade mit Klößen" knallt es.
    PaintEventArgs gehören nicht als Member in die Klasse, sie bleiben in Paint-Prozeduren.
    Wenn Du Fehler finden willst, schmeiß Try/Catch raus und lass es knallen, wo es knallt.
    Verstehe die Exception und behebe sie.
    Mit diesem Code fängt es an, dass was gemalt wird:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.Drawing.Drawing2D
    2. Public Class Form1
    3. Dim myPen As New Pen(Color.Black, 5)
    4. Dim punkte(4) As PointF
    5. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    6. myPen.StartCap = LineCap.Square
    7. myPen.EndCap = LineCap.Square
    8. myPen.LineJoin = LineJoin.Round
    9. End Sub
    10. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    11. Dim offsetX As Integer = 419
    12. Dim offsetY As Integer = 502
    13. Dim currentPositionX As Integer
    14. Dim currentPositionY As Integer
    15. Dim laenge1 As Integer
    16. Dim laenge2 As Integer
    17. Dim laenge3 As Integer
    18. Dim laenge4 As Integer
    19. Dim winkel1 As Integer
    20. Dim winkel2 As Integer
    21. Dim winkel3 As Integer
    22. If (txtLaenge1.Text = "") Then laenge1 = 0 Else laenge1 = Convert.ToInt32(txtLaenge1.Text)
    23. If (txtLaenge2.Text = "") Then laenge2 = 0 Else laenge2 = Convert.ToInt32(txtLaenge2.Text)
    24. If (txtLaenge3.Text = "") Then laenge3 = 0 Else laenge3 = Convert.ToInt32(txtLaenge3.Text)
    25. If (txtLaenge4.Text = "") Then laenge4 = 0 Else laenge4 = Convert.ToInt32(txtLaenge4.Text)
    26. If (txtWinkel1.Text = "") Then winkel1 = 0 Else winkel1 = Convert.ToInt32(txtWinkel1.Text)
    27. If (txtWinkel2.Text = "") Then winkel2 = 0 Else winkel2 = Convert.ToInt32(txtWinkel2.Text)
    28. If (txtWinkel3.Text = "") Then winkel3 = 0 Else winkel3 = Convert.ToInt32(txtWinkel3.Text)
    29. punkte(0) = New PointF(offsetX, offsetY)
    30. If laenge1 = 0 OrElse laenge2 = 0 OrElse winkel1 = 0 Then
    31. MessageBox.Show("Bitte geben Sie die Längen und Winkel ein!")
    32. Exit Sub
    33. End If
    34. Dim arrLaenge As Integer = punkte.Length
    35. Dim newPunkt As New PointF(offsetX + laenge1, offsetY)
    36. currentPositionX = offsetX + laenge1
    37. currentPositionY = offsetY
    38. punkte(1) = newPunkt
    39. If winkel1 = 0 Then
    40. arrLaenge = punkte.Length
    41. newPunkt = New PointF(currentPositionX + laenge2, currentPositionY)
    42. currentPositionX = currentPositionX + laenge2
    43. currentPositionY = currentPositionY
    44. punkte(2) = newPunkt
    45. Else
    46. arrLaenge = punkte.Length
    47. Dim a As Integer = 0
    48. Dim b As Integer = 0
    49. a = CInt(Math.Round(laenge2 * Math.Cos(winkel1), 0))
    50. b = CInt(Math.Round(laenge2 * Math.Sin(winkel1), 0))
    51. newPunkt = New PointF(currentPositionX + b, currentPositionY + a)
    52. currentPositionX = currentPositionX + b
    53. currentPositionY = currentPositionY + a
    54. punkte(2) = newPunkt
    55. End If
    56. PictureBox1.Invalidate()
    57. End Sub
    58. Private Sub PictureBox1_Paint(sender As Object, e As PaintEventArgs) Handles PictureBox1.Paint
    59. e.Graphics.DrawLines(myPen, punkte.ToArray)
    60. End Sub
    61. End Class
    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!
    @RodFromGermany
    Das Option Strict ON habe ich total vergessen.

    Dieses Programm sollte eigentlich nur ein Test sein, ob es überhaupt funktioniert, also wird es keine falschen Eingaben werden.

    Danke für den Code, ich werde mich melden, ob das funktioniert.

    Kirohn schrieb:

    Das Option Strict ON habe ich total vergessen.
    Das kannst Du im Studio eintragen, so dass permanent mit Strict On gecodet wird.
    Visual Studio - Empfohlene Einstellungen
    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!