[VB] ReDim Preserve fout

Pagina: 1
Acties:

  • Scyth
  • Registratie: Juli 2001
  • Laatst online: 16-03-2024

Scyth

Fat finger, three beer

Topicstarter
Okee, naar mijn weten is het goed om een array te redimmen als je posities gebruikt die de array nog niet heeft. Dan doe je:

Redim Preserve sArray(x)

Dat vat ik nog...
Maar nu komt 't vreemde.

Ik gebruik zo'n array: sArray(,) dus 2D array.
Die definieer ik zo:

Global sAnimData() As String

(ff geen insectensex over global/public)

En dan, als mijn parser bezig gaat, word ie on the fly geredimmt naar het aantal wat hij moet bevatten. Tot nu toe alles logisch.

Maar als mijn parser dan klaar is, en ik probeer de array later nog eens in een andere subroutine te redimmen (met preserve uiteraard), krijg ik subscript out of range.

[ed]
Nu las ik hier dat ik alleen 't laatste element kan redimmen als ik preserve gebruik.

Hoe kan ik dit omzeilen op een nette manier?

en ff wat anders: Waarom kan ik in mijn parser (in een module) _wel_ helemaal redimmen met preserve?
[/ed]

[ Voor 23% gewijzigd door Scyth op 28-10-2003 15:56 ]

Dell Studio XPS 16
Project: BavBierSub 1.0 BavBierSub 2.0


  • johnwoo
  • Registratie: Oktober 1999
  • Laatst online: 20:03

johnwoo

3S-GTE

Voor de hand liggende manier: geen tweedimensionale array gebruiken :Y)
Maak er gewoon een een-dimensionale array van, en bereken de index on-the-fly aan de hand van de gewenste rij en kolom (index = rij * aantal_kolommen + kolom, bij 0-based array en coordinaten)

4200Wp ZO + 840Wp ZW + 1680Wp NW | 14xIQ7+ + 1xDS3-L | MTVenusE | HWP1


  • Scyth
  • Registratie: Juli 2001
  • Laatst online: 16-03-2024

Scyth

Fat finger, three beer

Topicstarter
Mja, da's inderdaad een optie, maar wat ik mij afvraag is waarom, als mijn form laadt, en daarmee een cfg-parser word aangeroepen, er geen problemen plaatsvinden. Die parser staat in een module, en kan gewoon redimmen met een preserve ?

Dell Studio XPS 16
Project: BavBierSub 1.0 BavBierSub 2.0


  • Kix@$$
  • Registratie: December 2001
  • Laatst online: 15:33
Wat je mischien zou kunnen doen is een array in een array aanleggen. Je hebt dan ook het effect van een 2 dimensionale array maar mischien werkt et.

Dus:
Visual Basic:
1
2
3
4
5
6
7
8
Public m_arrBlaat() as Variant

Sub RedimEnzooi()
    Redim Preserve m_arrBlaat(5)
    m_arrBlaat(5) = Array("Woei", "Woei2")

    Debug.Print m_arrBlaat(5)(0)
End Sub


Het enigste nadeel hieraan is is dat je per array je de 2de dimentie aan moet maken...

[ Voor 4% gewijzigd door Kix@$$ op 29-10-2003 15:33 ]


  • Scyth
  • Registratie: Juli 2001
  • Laatst online: 16-03-2024

Scyth

Fat finger, three beer

Topicstarter
Mja, idd... Ik heb liever niet arrays in arrays. Wat ik mij afvraag is waarom het in het begin van 't programma, als de parser wordt aangeroepen; hij er gewoon overheendenderd, en ook gewoon alles preserved. Maar zodra ik later, bij het invoegen van _nog_ een nieuw element, dattie dan over z'n nek gaat.

Ik heb zelfs al geprobeerd een functie in een module te maken die dan probeert om um te redimmen 8)7 ... werkt ook niet...

Dell Studio XPS 16
Project: BavBierSub 1.0 BavBierSub 2.0


  • Kix@$$
  • Registratie: December 2001
  • Laatst online: 15:33
Scyth schreef op 30 oktober 2003 @ 13:04:
Mja, idd... Ik heb liever niet arrays in arrays. Wat ik mij afvraag is waarom het in het begin van 't programma, als de parser wordt aangeroepen; hij er gewoon overheendenderd, en ook gewoon alles preserved. Maar zodra ik later, bij het invoegen van _nog_ een nieuw element, dattie dan over z'n nek gaat.

Ik heb zelfs al geprobeerd een functie in een module te maken die dan probeert om um te redimmen 8)7 ... werkt ook niet...
Mja dat redimmen gaat zoizo niet werken omdat VB daarvoor in een verkeerde manier met arrays om gaat. Als je dan het eerste dimentie groter gaat maken is er geen ruimte meer voor om het op te slaan in het geheugen omdat daar de 2de dimentie gelijk begint...

  • Scyth
  • Registratie: Juli 2001
  • Laatst online: 16-03-2024

Scyth

Fat finger, three beer

Topicstarter
Weet je dat zeker? Hoe verklaar je dan dat een Redim Preserve aan het begin van mijn prog WEL werkt?

Dell Studio XPS 16
Project: BavBierSub 1.0 BavBierSub 2.0


  • Kix@$$
  • Registratie: December 2001
  • Laatst online: 15:33
Scyth schreef op 30 oktober 2003 @ 13:41:
Weet je dat zeker? Hoe verklaar je dan dat een Redim Preserve aan het begin van mijn prog WEL werkt?
Dat weet ik niet... Mischien heeft die dan de variabele nog niet helemaal aangemaakt ofzo...

Wat is de precieze code van je app?

Verwijderd

.

[ Voor 98% gewijzigd door Verwijderd op 31-10-2023 22:00 ]


  • El_Quedro
  • Registratie: September 2001
  • Laatst online: 04-08-2025

El_Quedro

Pininfarina

code:
1
2
3
Global sAnimData() As String

Redim Preserve sArray(x)


De TS zegt dat ie het zo niet kan redimmen. Het komt misschien omdat het zo moet:

Global sAnimData(,) as String
Redim Preserve sAnimData(X,Y)

Dat werkt wel.
Ik snapte ook niet helemaal het verband tussen sAnimData en sArray.

  • Crazy D
  • Registratie: Augustus 2000
  • Laatst online: 14-08 12:38

Crazy D

I think we should take a look.

Verwijderd schreef op 30 oktober 2003 @ 13:48:
Hmmm, ik meen me te herinneren dat je wel 2d arrays kunt redimmen. Weet je heel zeker dat je fout niet ergens anders in zit? Kun je wat (korte en uitvoerbare)code posten die je probleem aan toont?
Als je een multi-dimensionale array eenmaal hebt ge(re)dimt, kun je alleen de laatste dimensie redimmen. Probeer maar eens, redim de array eerst op (10, 2), en probeer er daarna (11, 2) van te maken: Subscript out of range.

Een oplossing zou kunnen zijn, door collections te gebruiken. Ook handig voor als je nog meer gegevens wilt gaan opslaan (per element), imho handiger en duidelijker dan met arrays ('wat was array(x, 1) nou ook alweer...").

[ Voor 10% gewijzigd door Crazy D op 30-10-2003 18:49 ]

Exact expert nodig?

Pagina: 1