VisualBasic Mehrdimensionales Array füllen

-Razzer-

Commodore
Registriert
Feb. 2011
Beiträge
4.470
Hallo,

habe ein Problem mit einem Array:

Das array selbst ist ein array(,) dessen Elemente wiederum einen array() ist.

Ich habe das array initialisiert mit:

Code:
Dim array(,)() As cls_DataItem
ReDim array(_k - 1, _k - 1)

Dim vector As cls_DataItem()
ReDim vector(_N - 1)

Sub Fill()
     For j = 0 To _k - 1
            For i = 0 To 1
                array(j, i) = vector
            Next i
     Next j

    For j = 0 To 2 * _N * _k - 1
           Dim DataItem As cls_DataItem
           DataItem = _DataFromList(j)
           If DataItem.IsValid Then
                array(DataItem.GetJindex, 0)(DataItem.GetIindex) = DataItem
           Else
                array(DataItem.GetJindex, 1)(DataItem.GetIindex) = DataItem
           End If

    Next j
End Sub

Nach einem Durchlauf mit _k=2, _N=10 und isValid() = True und GetJindex=0 und GetIindex=0 (Das DataItem kennt bereits seine genaue Position) müsste das DataItem ja an Position array(0,0)(0) sein.
Da ist es auch aber zusätzlich ist es auch an:
array(0,1)(0)
array(1,0)(0)
array(1,1)(0)

Ich habe 40 Daten aus der _DataFromList die ich eigentlich getrennt abspeichern will und dann mit array(0,0), array(0,1), array(1,0) und array(1,1) auf das array der Länge 10 zugreifen und zurückgeben.
Da es mir die Daten aber immer überschreibt steht in jeder Position des arrays nur die letzten 10 Zahlen - was eigentlich in array(1,1) steht.
Was ist der Fehler, weis jemand Rat?
 
Zuletzt bearbeitet:
Es ist sehr schwierig, darauf zu antworten, da wir nicht wissen, ob die Variablen wirklich gefüllt sind, und woher sie stammen (_k, _N, vector, cls_DataItem...).
 
Hab ich ja dazugeschrieben _k=2 _N=10, vector ist ein leerer Vector der Länge 10, cls_DataItem ist eine eigene Datenstruktur.
Diese ist korrekt und auch die _DataFromList ist korrekt befüllt.

Mein Problem beginnt erst mit der Zuweisung des arrays.

Er springt in die richtige If Bedingung füllt dann aber trotzdem alle Indices:
Für: Then Fall und GetJindex=0 und GetIindex=0

Soll:
array(0,0)(0)

Ist:
array(0,0)(0)
array(0,1)(0)
array(1,0)(0)
array(1,1)(0)
 
Deine J Schleife wird 40 mal durchlaufen.

J taucht aber nirgendwo innerhalb der Schleife bei den Array Zuweisungen auf.

Du bekommst also, je nachdem, was GetxIndex zurückliefert (offenbar nur 0 und 1), nur deine erwähnten Kombinationen.
 
j ist nur dafür da das nächste Item aus der _DataFromList zu holen.
array(x,y)(z)

x= {0,1} = _k = 2
y={0,1} = (isValid = True= 0 IsValid = False = 1}
z = {0,..,9} = _N = 10

Insgesamt 40 Positionen.

Wieso füllt er mir bei einem Durchlauf alle Positionen von (x,y) - ich will ja nur die eine und nicht alle?
 
Ein For-Schleifen Durchlauf:

j=0
DataItem = _DataFromList(0) = erster Item in der Liste
isValid = True
GetJindex=0
GetIindex=0

Soll:
array(0,0)(0) = DataItem

Ist:
array(0,0)(0) = DataItem
array(0,1)(0) = DataItem
array(1,0)(0) = DataItem
array(1,1)(0) = DataItem

Das ist das woran es scheitert - habe das DataItem an jeder Position und nicht nur an (0,0)

Im Endeffekt macht er bei jedem Durchlauf j immer:
array(0,0)(j) = DataItem
array(0,1)(j) = DataItem
array(1,0)(j) = DataItem
array(1,1)(j) = DataItem

und überschreibt mir dadurch natürlich die korrekten Werte
 
Zuletzt bearbeitet:
Sicher, daß das Array nicht schon so nach deiner ersten For Schleife gefüllt ist?
 
Die erste For Schleife definiert nur die Länge des Arrays der an array(x,y) gespeichert wird und er ist leer an jeder Position "Nothing" - hab ich schon gedebugged.

Hatte auch schon anstatt array(,)() zwei arrays mit array1()() und array2()() für Then und Else Fall.
Und trotzdem wurden immer beide arrays befüllt obwohl immer nur ein Fall ausgeführt wurde.
 
Zuletzt bearbeitet:
Ja, wie gesagt, daß ist schwierig zu analysieren, müßte ich mal nachbauen.

Du verwendest ja ein verzweigtes Array und kein 3 dimensionales. Ist also nicht ganz so trivial.
 
Irgendwas muss ja an der Syntax verkehrt sein - vom logischen müsste es ja klappen.
Ergänzung ()

Habe den Fehler gefunden.

In Zeile 10 wird ja der vector zugewiesen auf alle Zeilen+Spalten. Ich bin jetzt davon ausgegangen das das Objekt direkt gespeichert wird aber es wird nur eine Art Zeiger gespeichert, d.h. wird vector geändert ändert sich eben nicht nur der eine Wert sondern alle Verweise die auf vector zeigen in dem Fall alle Indices meines arrays. Habe es jetzt mit Listen gemacht und habe den vector in jeden Indice neu generiert.
 
Zuletzt bearbeitet:
Zurück
Oben