Unterschiede der Datentypen Array Int32[*] und Int32[]

  • VB.NET

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von LucaWelker.

    Unterschiede der Datentypen Array Int32[*] und Int32[]

    Hi,
    ich hab eine Frage zu Datentypen von Arrays.

    Ich hab eine Funktion welche als übergabe eine Variable vom Typ System.Array erwartet.

    Dem entsprechend hab ich folgende Variable angelegt:

    VB.NET-Quellcode

    1. Dim SH_arr(1000) As Integer


    Beim aufrufen der Funktion kommt nun die folgende Fehlermeldung zurück:
    "Das Objekt des Typs System.Int32[*] kann nicht in Typ System.Int32[] umgewandelt werden."

    Worin besteht den nun der Unterschied zwischen Int32[*] und Int32[] und wie muss man das Array deklarieren das es ein Int32[*] wird ?

    Gruß aup

    LucaWelker schrieb:

    Müsste die Syntax um ein Array zu erzeigen nicht eigl. folgender Maßen sein?

    VB.NET-Quellcode

    1. Dim SH_arr As Integer() = new Integer(1000)
    Nein, das New kommt wird nur beim Benutzen einer Klasse gebraucht wie z.b. dem Streamreader oder einem CookieContainer oder einer Liste.
    Integer usw sind Datentypen aber auch ne Klasse, das ist bisschen schwer zu erklären.


    Also so:

    VB.NET-Quellcode

    1. Dim Array() As Integer = {1, 2, 3, 4, 5}

    oder

    VB.NET-Quellcode

    1. Dim Array As Integer() = {1, 2, 3, 4, 5}

    oder

    VB.NET-Quellcode

    1. Dim Array(123) As Integer


    Wahrscheinlich gibts noch was, aber das ist das was ich benutze, wenn ich ein Array benutze.
    ...also ich übergebe das Array an die Methode eines Objektes (Es ist das Objekt einer Klasse für den Zugriff von Werten aus OPC Servern)

    hier noch mal der Quellcode etwas ausführlicher:

    VB.NET-Quellcode

    1. Dim arr_TagNames(200) As String
    2. Dim count_tagnames As Integer = arr_TagNames.Length
    3. Dim arr_ch(count_tagnames) As Integer
    4. Dim Sh_arr(1000) As Integer
    5. Dim Er_arr(1000) As Integer
    6. [...]
    7. ' arr_TagNames wir hier mit den TagNames gefüllt
    8. [...]
    9. OPCMyItems.AddItems(count_tagnames, arr_TagNames, arr_ch, Sh_arr, Er_arr)
    10. 'AddItems(Count As Long, ItemIDs() As String, ClientHandles() As Long, ByRef ServerHandles() As Long, ByRef Errors() As Long)
    11. 'Deinition der Object Referenz der AddItem Methode:



    @LucaWelker

    VB.NET-Quellcode

    1. Dim SH_arr As Integer() = new Integer(1000)

    Diese Art der Deklaration von Arrays ist mir unbekannt, wird auch mit einem Fehler markiert in VB.net


    @jvbsl
    ...das dachte ich auch am Anfang, aber die Definition mit:

    VB.NET-Quellcode

    1. Dim Sh_arr() As Integer
    2. Dim Er_arr() As Integer

    führt zu der gleich Meldung

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

    Hab ichs jetz falsch verstanden oder wieso geht das bei mir wenn ichs so mach:

    VB.NET-Quellcode

    1. Private Sub test()
    2. Dim c(1000) As Integer
    3. foo(c)
    4. End Sub
    5. Private Sub foo(ByVal a As Array)
    6. MsgBox(UBound(a))
    7. End Sub


    Das geht bei mir ohne Fehler wenn ich jetz test() ausführe, oder kann mir einer erklärn was ich an der Frage falsch versteh?
    @high152
    Das ganze ist auf deine Art kein Problem, das Problem ist das die Methode der Klasse anscheinen einen anderen Datentyp des übergebenen Arrays erwartet.

    @picoflop
    Leider kommt auch bei dieser Art der Deklaration eine ähnliche Fehlermeldung:
    "Das Objekt des Typs System.Int32[*] kann nicht in Typ System.Int64[] umgewandelt werden"

    Mich würde doch mal sehr interessieren was es mit diesem '*' in der Datentyp angabe auf sich hat.
    also bei mir lautet die fehlermeldung anners, bei:

    VB.NET-Quellcode

    1. Private Sub Button2_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button2.Click
    2. Dim arr_TagNames(200) As String
    3. Dim count_tagnames As Integer = arr_TagNames.Length
    4. Dim arr_ch(count_tagnames) As Integer
    5. Dim Sh_arr(1000) As Integer
    6. Dim Er_arr(1000) As Integer
    7. AddItems(count_tagnames, arr_TagNames, arr_ch, Sh_arr, Er_arr)
    8. '
    9. End Sub
    10. Sub AddItems(ByVal Count As Long, ByVal ItemIDs() As String, ByVal ClientHandles() As Long, _
    11. ByRef ServerHandles() As Long, ByRef Errors() As Long)
    12. End Sub

    nämlich, dass man long-Arrays nicht in int-Arrays konvertieren kann.

    Was ja logisch ist (wie 99% aller Fehlermeldungen ühaupt ;))

    Von '*' steht da nix.

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

    high152 schrieb:

    Nein, das New kommt wird nur beim Benutzen einer Klasse gebraucht wie z.b. dem Streamreader oder einem CookieContainer oder einer Liste.

    Mir ist klar wie das Funktioniert ;) ich war nur verwirrd, da in C#(die Primäresprache welche ich Programmiere) Arrays mit new Initialisiert werden. Man könnte es zwar auch ohne aber dann muss meines wissens vorher schon feststehen wie viel Elemente das Array enthalten muss.

    Ich weiß nicht ob man hier die Logik von C++ übertragen kann:

    Quellcode

    1. int xxx[6]; //Initialisiert ein Array mit 6 Elementen auf dem Stack
    2. int xxx[] = new int[xxx]; //Initiialisiert ein Array mit var Elementen auf dem Heap

    (bei der zweiten bin ich mir grade nicht ganz sicher ob nach dem Namen auch noch [var] kommen muss oder nur [].)
    Bei der ersten schreibweiße kann Beispielsweiße keine zum Kompilierzeitpunkt unbestimmte größe angegeben werden, da der Programmspeicher zu diesem Zeitpuznkt berechnet wird. Beim zweiten Beispiel schon da die Variable im Freispeicher angelegt wird.

    In C# verwende ich Variante zwei, ich weiß nicht ob es hier wäre wie in C++ das man für Variante eins schon vorher die Anzahl wissen muss...?!
    Deshalb dachte ich in VB.NET sollte man es auch verwenden wobei er ja im obigen beispiel die anzahl der Elemente schon weiß.

    high152 schrieb:

    Integer usw sind Datentypen aber auch ne Klasse, das ist bisschen schwer zu erklären.

    Boxing / Unboxing ;) bin ich drüber aufgelärt :)

    lg.
    lg.

    LucaWelker