• Privacywetgeving
    Het is bij Helpmij.nl niet toegestaan om persoonsgegevens in een voorbeeld te plaatsen. Alle voorbeelden die persoonsgegevens bevatten zullen zonder opgaaf van reden verwijderd worden. In de vraag zal specifiek vermeld moeten worden dat het om fictieve namen gaat.

matrix hangen aan een dictionary of collection ? uitlezen

Status
Niet open voor verdere reacties.

sylvester-ponte

Verenigingslid
Lid geworden
19 apr 2007
Berichten
6.551
de reclame versmalt mijn codevenster
daardoor wordt het wat minder leesbaar.

hallo wat gaat hier fout?
Code:
Sub test()
    Dim D, N() As Integer
    Set D = CreateObject("scripting.dictionary")
    ReDim N(5)
    
    N(2) = 3
    N(5) = 5
    D.Add "1", N

    a2 = D.Item("1")(2) 'a2 wordt 3
    a3 = D.Item("1")(5) 'a3 wordt 5
    
    D.Item("1")(2) = 6  ' geen foutmelding !! dus verwacht ik dat de waarde van de matrix gewijzigd wordt
    a4 = D.Item("1")(2) ' a4 wordt 3 !!!! dat had 6 moeten zijn
    
End Sub
met een collection lukt het me ook niet om de matrix te wijzigen.
 
Laatst bewerkt:
alphamax,
met:
temp = D.Item("1")
wordt alle data van D.Item("1") naar temp gekopieerd

en met:
D.Item("1") = temp
weer terug

dat wilde ik juist voorkomen.
het gaat om grote hoeveelheden data

ik zoek een methode om direct bij deze data te komen en dan te wijzigen.
uit lezen gaat wel direct. dat hoeft niet via een "temp"
 
Definieer je array in een class module en voeg de class objecten toe aan je dictionary. Dan werk je met pointers naar geheugenblokken ipv dat je met de geheugenblokken zelf aan het schuiven bent (waarvan het overigens nog maar de vraag is hoe erg dat is.)
 
Waarom gebruik je een dictionary ?

Code:
Sub M_snb_dict()
sn = Array(1, 2, 3, 4, 5)

With CreateObject("scripting.dictionary")
.Add "It_1", sn

MsgBox .Item("It_1")(2)

sn = .Item("It_1")
sn(2) = 6
.Item("It_1") = sn

MsgBox .Item("It_1")(2)
End With
End Sub

Code:
Sub M_snb_coll()
    sn = Array(1, 2, 3, 4, 5)
    
    With New Collection
        .Add sn, "It_1"
        
        MsgBox .Item("It_1")(2)
        
        sn = .Item("It_1")
        sn(2) = 6
        .Remove "It_1"
        .Add sn, "It_1"
        
        MsgBox .Item("It_1")(2)
    End With
End Sub

Code:
Sub M_snb_array()
    sn = Array(1, 2, 3, 4, 5)
    MsgBox sn(2)
    sn(2) = 6
    MsgBox sn(2)
End Sub
 
pixcel: dat met die class module lijkt me een mooie oplossing.
Maar het probleem bij de class is dat een matrix niet publiek gedeclareerd mag worden.
Dus moeten er allerlei "letten" en "getten" geschreven worden die op zich weer vertragend werken.
Directe toegang tot de matrix is handiger en sneller.



Wat ik graag wil gebruiken is : Matrix2=Matrix1 om situaties te kopiëren .

Een spelbord (met alle bordwaarderingen ) Past in een 200 * 100 matrix van integers.
Nu is het de bedoeling dat na iedere zet een kopie gemaakt wordt, en dat in de kopie de volgende zet uitgevoerd wordt.
Terug zetten is op die manier heel eenvoudig en snel.
Je zet de pointer terug en probeert daar de volgende mogelijke zet. enz enz.....

snb: met een 3D matrix(150*200*100) is het dan op de een of andere manier mogelijk om zo te kopieren:
matrix(2)=matrix(1)
Zodat die 200*100 waarden gekopieerd worden? naar de volgende "laag"
Of moet ik daarvoor altijd een loopje gebruiken?
Mischien bestaat er iets van een move instructie?
 
Code:
Sub M_snb_dict()
   ReDim sn(150, 200, 100)
   sn(2, 2, 3) = 25
   
   With CreateObject("scripting.dictionary")
      .Add "It_1", sn

      MsgBox .Item("It_1")(2, 2, 3)

      sn = .Item("It_1")
      sn(2, 2, 3) = 6
      .Item("It_1") = sn

      MsgBox .Item("It_1")(2, 2, 3)
  End With
End Sub

of, wat je waarschijnlijk wil:

Code:
Sub M_snb_dict()
   ReDim sn(200, 100)
   sn(2, 3) = 25
   
   With CreateObject("scripting.dictionary")
      For j = 1 To 150
        .Add "It_" & j, sn
      Next
      
      MsgBox .Item("It_20")(2, 3)

      sn = .Item("It_20")
      sn(2, 3) = 6
      .Item("It_20") = sn

      MsgBox .Item("It_20")(2, 3)
  End With
End Sub
 
Laatst bewerkt:
Ik zou alle stappen vastleggen in een eenvoudig log, net zoiets als bij schaken (zie http://nl.wikipedia.org/wiki/Schaaknotatie), of nog eenvoudiger
Dat neemt minder plaats in, en is misschien zelfs sneller te reconstrueren dan het kopieeren van een matrix.
 
Laatst bewerkt:
Of gebruik een array Borden(1 to 150) As udtBord
met udtBord een array Cells(1 to 200, 1 to 100) As Integer
Simpel en geen collectie nodig.

Mogelijk is een oplossing met 2 of 3 class modules nog beter. Gebruik van Property Let/Get/Set is echt niet vertragend, het Excel objectmodel barst er van.
 
pixcel: die laatste van jou getest:
Code:
Type udBord
    Cells(1 To 200, 1 To 100) As Integer
End Type

Sub test()
    Dim St(1 To 150) As udBord
    St(1).Cells(2, 3) = 5
    a1 = St(1).Cells(2, 3) 'klopt is 5
    
    St(2) = St(1) 'kopieren van een laag werkt prima en snel
    
    a2 = St(2).Cells(2, 3) 'toegang tot de lagen is eenvoudig
    St(1).Cells(2, 3) = 4
    a2 = St(2).Cells(2, 3)
    a1 = St(1).Cells(2, 3)
End Sub
zoiets gaat het worden.
Ik was er nooit opgekomen om een type te gebruiken.
Iedereen heel veel dank voor al die moeite, ik heb weer veel geleerd :thumb:
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan