Arrays richtig behandeln VB2010



  • Hallo ins Forum,
    ist nicht ganz das richtige Forum hier ...
    dennoch ein Frage zu MS VB 2010 Express.

    Sub test1 funzt wie erwartet > Sub test2 NICHT
    was genau passiert da ?

    REM in VB Basic funzt das test2 nicht
    Dim A(2) As Boolean

    Sub test()
    m: A(1) = Not A(1)
    REM test1(A)
    test2(A)
    GoTo m
    End Sub

    Sub test1(ByVal ar() As Boolean)
    Static v(2) As Boolean
    Debug.Print("REM 1 >> " & ar(1) & " / " & v(1))
    v(1) = ar(1)
    Debug.Print("REM 2 >> " & ar(1) & " / " & v(1))
    End Sub
    REM 1 >> True / False
    REM 2 >> True / True
    REM 1 >> False / True
    REM 2 >> False / False
    REM 1 >> True / False
    REM 2 >> True / True
    REM 1 >> False / True
    REM 2 >> False / False
    REM 1 >> True / False
    REM 2 >> True / True
    REM 1 >> False / True
    REM 2 >> False / False

    Sub test2(ByVal ar() As Boolean)
    Static v(2) As Boolean
    Debug.Print("REM 1 >> " & ar(1) & " / " & v(1))
    v = ar
    Debug.Print("REM 2 >> " & ar(1) & " / " & v(1))
    End Sub
    REM 1 >> True / False
    REM 2 >> True / True
    REM 1 >> False / False
    REM 2 >> False / False
    REM 1 >> True / True
    REM 2 >> True / True
    REM 1 >> False / False
    REM 2 >> False / False
    REM 1 >> True / True
    REM 2 >> True / True
    REM 1 >> False / False
    REM 2 >> False / False

    Viele Dank für's Lesen und Nachdenken

    mfg kaben



  • Arrays sind in .NET (und damit auch in VisualBasic .NET) Reference-Types.
    D.h. wenn du

    v = ar
    

    schreibst, dann werden nicht die Werte im Array ar in das Array v kopiert! Sondern es wird bloss geändert auf welches Array-Objekt die Variable v zeigt (nämlich auf das selbe Array-Objekt worauf auch ar zeigt).

    v zeigt also danach auf das selbe Array wie ar , und damit auf das selbe Array wie A . Was dann auch das beobachtete Verhalten erklärt.

    Das ByVal beim Parameter bezicht sich also nicht auf den Array-Inhalt, sondern auf die Referenz.
    Das ByVal bewirkt hier also nur dass du in test2 nicht ändern kannst auf welches Array A zeigt.

    Das ist zugegebenermassen etwas verwirrend. Und auch etwas unpraktisch. Es ist allerdings vollkommen logisch, und wenn man es erstmal behirnt hat gewöhnt man sich auch irgendwann daran.


  • Mod

    Was erwartest du, was passiert stattdessen?

    Zuweisung von Arrays in VB ist keine tiefe Kopie. Es wird quasi nur Größeninformation zugewiesen, sowie ein Zeiger auf die Daten. Das heißt bei test1 weist du dem zweiten Wert in v tatsächlich einen neuen Wert zu, in test2 machst du v hingegen zu einer Referenz auf das Array A. OB du das nun erwartest oder nicht, können wir nicht wissen, aber das ist der wesentliche Unterschied.

    edit: Zu langsam. Ich habe nie mit VB gearbeitet und musste erst nachschlagen, wie die Sprache funktioniert 🙂



  • Hallo hustbaer & SeppJ,

    die Erklärungen habe ich verstanden und beantworten meine Frage.
    Vielen Dank für die schnelle Antwort.

    mfg kaben


Anmelden zum Antworten