Übergabe von Parameter als Referenz von Array an Sub Programm

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von Doener09.

    Übergabe von Parameter als Referenz von Array an Sub Programm

    Liebe VB-ler,
    das Problem stellt die Übergabe des Parameters dar. Fehlermeldung: Der Typ vom Wert "Integer" kann nicht in "1-dimensionales Array von Integer" konvertiert werden. Das Grundgerüst für den Code entspricht einer Musterlösung...Komme nach längerer Recherche nicht weiter. Danke im voraus für die Hilfe

    VB.NET-Quellcode

    1. Public Class Mittelwert
    2. 'Array zur Parameterübergabe, hier soll der Parameter als Referenz übergeben werden
    3. Private Function Klassenbelegung()
    4. Dim Zaehler%, Anzahl%, Programmabbruch$
    5. Dim Schülerzahl(4) As Integer
    6. 'Anzahl = InputBox("Wieviele Klassen möchten Sie anlegen?") 'Größe von Array festlegen
    7. 'ReDim Schülerzahl(Anzahl)
    8. For Zaehler = 1 To 4
    9. Schülerzahl(Zaehler) = InputBox("Schülerzahl der Klasse" & Zaehler & "eingeben")
    10. Next Zaehler
    11. Do
    12. Zaehler = InputBox("Geben Sie die Nr. der Klasse ein, deren Schülerzahl Sie sehen möchten")
    13. MsgBox("Die Klasse" & Zaehler & "hat" & Schülerzahl(Zaehler) & "Schüler")
    14. Call Mittelwert(Schülerzahl(Zaehler))
    15. (...) als Referenz, ABER irgendwo liegt das Problem! Der Ausdruck (Schülerzahl(Zaehler)) wird wellig unterstrichen mit oben genanntem Fehler
    16. Programmabbruch = InputBox("Soll das Programm beendet werden? (j/n)")
    17. Loop Until Programmabbruch = "j"
    18. End Function
    19. Private Sub Mittelwert(ByVal Zahlenfeld() As Integer)
    20. Dim Fachnummer%, Summe%
    21. Summe = 0
    22. For Fachnummer = LBound(Zahlenfeld) To UBound(Zahlenfeld)
    23. Summe = Summe + Zahlenfeld(Fachnummer)
    24. Next Fachnummer
    25. MsgBox("Im Durchschnitt sind" & Summe / (Fachnummer - 1) & "Schüler in den Klassen")
    26. End Sub
    27. End Class
    @Doener09:: Willkommen im forum. :thumbup:
    Als erstes: Gib Deinem Programm Option Strict On, da kommst Du nicht in die Verlegenheit, aus Äpfeln und Glühbirnen einen Obstsalat machen zu wollen.
    Dann: Indizes fangen in .NET mit 0 an, nicht mit 1.
    In diesem Sinne kannst Du das Array Dim Schülerzahl(3) As Integer mit 3 anlegen, 3 ist (in VB.NET, nicht aber C#) der höchste vorkommende Index (in C# [4]).
    Außerdem ist es sinnvoll, neben der Fehlermeldung auch die Fehlerzeile anzugeben, das hilft bei der Orientierung.
    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!
    danke für die willkommensgrüße,
    -werde den tipp bzgl. zeilenangabe beherzigen
    -das programm ist für eine ältere version geschrieben worden, da gab es noch "option base 1" um den array von eins zu starten,habe es jetzt aber geändert und nachträglich deklariert. so wie es in meinem aktuellen code eingegeben ist, habe ich die schlampigkeit, dass ich auch eine Klasse 0 mit entsprechend 0 Schülern abfragen könnte, aber sonst würde es funktionieren
    -wenn ich die "option strict on" setze wird alles wesentliche blau-wellig unterstrichen und ich bekomme folgende Fehlermeldungen:
    Zeile 4: erfordert eine As-Klausel
    Zeile 7: Option Strict On lässt keine impliziten Konvertierungen von Integer in String zu
    Zeile 10: Option Strict On lässt keine impliziten Konvertierungen von Integer in String zu
    Zeile 13: Option Strict On lässt keine impliziten Konvertierungen von Integer in String zu
    Zeile 15: Der Typ vom Wert "Integer" kann nicht in "1-dimensionales Array von Integer" konvertiert werden.

    Sollte das alles keinen Sinn machen für .NET, dann bitte ich um rückmeldung. ich schau ich nochmal diverse tutorials an, habe aber leider noch nichts tolles gefunden (bzw. vielleicht auch noch nicht kapiert :rolleyes: )

    VB.NET-Quellcode

    1. Option Strict On 'Schränkt implizite Datentypkonvertierungen auf erweiternde Konvertierungen ein?!
    2. Public Class Mittelwert
    3. 'Array zur Parameterübergabe, hier soll der Parameter als Referenz übergeben werden
    4. Private Function Klassenbelegung()
    5. Dim Zaehler%, Anzahl%, Programmabbruch$
    6. Dim Schülerzahl() As Integer
    7. Anzahl = InputBox("Wieviele Klassen möchten Sie anlegen?") 'Größe von Array festlegen
    8. ReDim Schülerzahl(Anzahl)
    9. For Zaehler = 1 To Anzahl
    10. Schülerzahl(Zaehler) = InputBox("Schülerzahl der Klasse" & Zaehler & "eingeben")
    11. Next Zaehler
    12. Do
    13. Zaehler = InputBox("Geben Sie die Nr. der Klasse ein, deren Schülerzahl Sie sehen möchten")
    14. MsgBox("Die Klasse" & Zaehler & "hat" & Schülerzahl(Zaehler) & "Schüler")
    15. Call Mittelwert(Schülerzahl(Zaehler)) '(...) als Referenz, ABER irgendwo liegt das Problem!
    16. Programmabbruch = InputBox("Soll das Programm beendet werden? (j/n)")
    17. Loop Until Programmabbruch = "j"
    18. End Function
    19. Private Sub Mittelwert(ByVal Zahlenfeld() As Integer)
    20. Dim Fachnummer%, Summe%
    21. Summe = 0
    22. For Fachnummer = LBound(Zahlenfeld) To UBound(Zahlenfeld)
    23. Summe = Summe + Zahlenfeld(Fachnummer)
    24. Next Fachnummer
    25. MsgBox("Im Durchschnitt sind" & Summe / (Fachnummer - 1) & "Schüler in den Klassen")
    26. End Sub
    27. End Class
    dassis vb6-code, den kannst komplett vergessen.

    Du kannst vb.net nicht lernen anhand von vb6-code.

    alles in die Tonne, und anfangen mit neu konzipieren.
    Das ist ein Problem, wennman vorher vb6 gemacht hat, dass man das immer wieder in vb.net weiter-benutzt. Vor dieser Unart kannst du dich ein Stückweit schützen durch böse Funktionen vermeiden

    achso - zum vb.net lernen: dieses Buch lesen (hingegen das Galileio-Openbook ist Mist)
    Die Methode Mittelwert() erwartet als Argument ein Array, du übergibt jedoch keins. Du übergibst den Wert, der im Array Schülerzahl an Position Zaehler liegt.

    Soweit ich das sehe, musst du nur das Array Schülerzahl übergeben und es sollte laufen.

    Allerdings stimme ich meinem Vorredner zu, das lässt sich wesentlich schöner und übersichtlicher regeln.

    PS: Autokorrektur ist ein Fluch...

    Edit: Habe ein kleines Beispiel fertig gemacht, hilft dir vielleicht etwas ^^

    Arbeitet mit einer Textbox, einem Button, einer Listbox und einem Label. Damit bleibt die Übersicht immer up-to-date.

    VB.NET-Quellcode

    1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    2. 'der Listbox den aktuellen Wert übergeben
    3. ListBox1.Items.Add(TextBox1.Text)
    4. 'Summe aller Schüler
    5. Dim GesamtSchüler As Integer = 0
    6. For i = 0 To ListBox1.Items.Count - 1
    7. GesamtSchüler += CInt(ListBox1.Items(i))
    8. Next
    9. 'dem Label die Werte übergeben
    10. Label1.Text = "Im Durchschnitt " & (GesamtSchüler / ListBox1.Items.Count).ToString("#") & _
    11. vbNewLine & " in " & ListBox1.Items.Count.ToString & " Klassen."
    12. 'Textbox zurücksetzen
    13. TextBox1.Text = ""
    14. End Sub

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

    Doener09 schrieb:

    Option Strict On lässt keine impliziten Konvertierungen von Integer in String zu
    Solch sind die meisten Fehler.
    Du musst die Konvertierungen selbst machen, da weißt Du wenigstens, was genau passiert. Implizit kann das schon mal vor die Hose gehen.
    Also:

    VB.NET-Quellcode

    1. Dim i As Integer = 5
    2. Dim txt As String = i.ToString
    3. Dim j As Integer = Integer.Parse(txt)
    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!