Funktionskopf mit optionalen array-Parameter

  • VB.NET

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

    Funktionskopf mit optionalen array-Parameter

    Hallo allerseits!

    Nach langer Pause habe ich wieder den Weg zurück nach VB gefunden - und scheitere promt schon bei einem Funktionskopf :S

    Ich habe einen SerialPort, über welchen ich einige bytes senden will. Dabei gibt es ein genau einzuhaltendes Befehlsformat, dass aus 3 Teilen besteht: dem Befehl (2 Bytes), einem ersten Parameter (4 bytes) und einem zweiten Parameter (2 oder mehr bytes). Einige Befehle haben keine Parameter, hier sind die Variablenfelder mit Nullen zu füllen.

    Daraus habe ich mir folgende Funktion zusammengebastelt:

    VB.NET-Quellcode

    1. Private Function serialWriteCommand(ByVal cmd As Byte(), Optional ByVal var1 As Byte() = New Byte(4) {0, 0, 0, 0}, Optional ByVal var2 As Byte() = New Byte(2) {0, 0}) As Boolean
    2. SerialPort1.Write(cmd, 0, 2)
    3. SerialPort1.Write(var1, 0, 4)
    4. If var2.Length > 2 Then
    5. SerialPort1.Write(var2, 0, var2.Length)
    6. Else
    7. SerialPort1.Write(var2, 0, 2)
    8. Return True
    9. End If
    10. Return False
    11. End Function


    Nun beschwert sich VB aber mit verschiedensten Meldungen, dass meine optionale byte-array-Initialisierung nicht zulässig ist. Im obigen Beispiel klagt der Compiler über "Dem Arrayinitialisierer fehlen 1 Elemente" ?(

    Würde mich sehr freuen, wenn mir hier jemand einen Tipp geben könnte..

    Danke!
    @Luke1.1 Willkommen im Forum. :thumbup:
    Probier mal diesen:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Function serialWriteCommand(cmd As Byte(), Optional var1 As Byte() = Nothing, Optional var2 As Byte() = Nothing) As Boolean
    2. If var1 Is Nothing Then
    3. var1 = New Byte() {0, 0, 0, 0}
    4. End If
    5. If var2 Is Nothing Then
    6. var2 = New Byte() {0, 0}
    7. End If
    8. SerialPort1.Write(cmd, 0, 2)
    9. SerialPort1.Write(var1, 0, 4)
    10. If var2.Length = 2 Then
    11. SerialPort1.Write(var2, 0, 2)
    12. Return True
    13. End If
    14. SerialPort1.Write(var2, 0, var2.Length)
    15. Return False
    16. End Function
    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!
    Hallo,
    um noch eine Erklärung für deine Fehlermeldung nachzuliefern. In deinem Parameter erzeugst du ein Array mit 5 Elementen, (Optional ByVal var1 As Byte() = New Byte(4) {0, 0, 0, 0}) nicht mit 4. Deshalb die Meldung
    "Dem Arrayinitialisierer fehlen 1 Elemente"
    . VB.NET hat diese komische Eigenart; einen Grund konnte ich dafür in der Doku auf die Schnelle nicht finden.
    Außerdem muss ein Default-Wert in Parametern ein konstanter Ausdruck sein und ein Array ist das (leider) nicht. Deshalb würde dein Code trotz korrigierter Initialisierer nicht korrekt sein; die Variante von RodFromGermany wäre dann the way to go.
    Willkommen im Forum.

    Man zähle von Null an und erhalte: New Byte(4) {0, 0, 0, 0} ist ein ByteArray mit 5(!) Elementen. Daher will der Compiler auch 5 Default-Elemente. Genauso New Byte(2) {0, 0} - Ein ByteArray mit 3 Elementen. Bei New Byte(X) gibt X nicht die Anzahl, sondern den höchsten Index an. Und da die Zählung bei Null beginnt …
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Hallo zusammen!

    Wow - unglaublich, wie schnell Ihr seid! Ich hatte vor heute keinesfalls mit einer Antwort gerechnet..

    Vielen Dank @RodFromGermany, so funktioniert das Ganze. Geht also schlichtweg nicht direkt im Funktionskopf. @ISliceUrPanties hat ja noch eine Erklärung dazu nachgeliefert..

    Danke auch für den Hinweis mit den Arrayelementen - ich habe in letzter Zeit viel mit C/C++ gemacht, dort zählt man wohl etwas anders als in VB ;)

    Luke1.1 schrieb:

    dort zählt man wohl etwas anders als in VB
    Jein.
    Es gibt BASIC-Dialekte, die sind 1-basiert.
    .NET ist generell 0-basiert.
    Damit alte BASIC-Quellen möglichst einfach nach VB.NET portiert werden können, enthalten VB.NET-Arrays ein Element mehr als angegeben, um die {0...n-1}- und die {1...n}-Zählung sichern zu können.
    So ist einzig die Instanziierung eines Arrays anders, die Zugriffe kannst Du so machen, wie Du es aus C/C++ gewohnt bist.
    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!