Avatar billede havmaage Juniormester
11. februar 2003 - 21:22 Der er 13 kommentarer og
2 løsninger

dynasik allokering af array

Ok, hmm Dette spørgsmål kan måske virke simpelt, men alligevel (Det må da kunne lade sig gøre!!)
AT allokere et array uden man ved hvor stort det er på forhånd.

dim Ar(100) ''' Jamen hvis jeg f.eks vil løbe igennem dn database med x antal record og fylde en værdi fra databasen ind i et array skal jeg så virkelig først counte på antal record for dynamisk at få allokeret det plads der er nødvendigt.
Hurtig illustration af hvad jeg forestiller mig.

dim Aj() As integer
Dim i As integer
do while not rs.eof
Aj(i)=rs!id
i=i+1
rs.movenext
loop

Men her kommer der subscript out of range.
Så har jeg forsøgt noget med redim etc... men har ikke fået det til at spille
please VB hajer
giv mig et praj :-)
Avatar billede somaliomar Praktikant
11. februar 2003 - 21:53 #1
Du skal lige huske på, at når du dimensionerer array, er den først række altid 0. Dvs. at hvis du vil lave et array med 100 rækker i skal du i koden skrive:

Redim Aj(99) 'Fra 0 til 99

Du kan tælle, hvor mange records, der er i databasen ved at sende forespørgslen

strSQL = "SELECT Count(*) AS AntalRec FROM Tabel"
Avatar billede havmaage Juniormester
11. februar 2003 - 21:58 #2
Vil det sige at jeg ikke dynamisk kan allokere et array, men at man som udgangspunkt skal vide hvor mange elementer et array mindt skal indeholde.
Det er ik for at være på tværs men i andre sprog er der ingen problemer med det.
Avatar billede somaliomar Praktikant
11. februar 2003 - 22:00 #3
Jep, du skal vide, hvor mange pladser du vil bruge i array'et
Avatar billede bernhof Nybegynder
11. februar 2003 - 22:00 #4
Du kunne også benytte en Collection istedet for en array.
Dens kapacitet defineres ikke på forhånd, så du bare kan fylde i den, som du har lyst.

Dim col As New Collection

Do Until RS.EOF
    col.Add RS("id")
Loop

- Mikkel
Avatar billede somaliomar Praktikant
11. februar 2003 - 22:00 #5
Din kode kan se sådan ud

Dim Aj() As integer
Dim i As integer

'Tælle antal records...
Redim Aj(intAntalRecord-1)
i = 0

do while not rs.eof
Aj(i)=rs!id
i=i+1
rs.movenext
loop
Avatar billede bernhof Nybegynder
11. februar 2003 - 22:02 #6
(jeg mangler lige at placere RS.MoveNext i mit eksempel)
Avatar billede joern Nybegynder
11. februar 2003 - 22:03 #7
Hej.

Det er ikke nødvendigt først at tælle, men det er nødvendigt at anvende 'Preserve' ved ReDim, ellers mistes allerede indlæste værdier.

Dim Aj() As string
Dim i As integer  '(eller long)  integer går kun til 32000

  i = 0          'ikke strengt nødvendig
Do While not rs.eof
  Redim Preserve Aj(i)
  Aj(i)=rs!id
  i=i+1
  rs.movenext
Loop

M.v.h.  Jørn
Avatar billede havmaage Juniormester
11. februar 2003 - 22:04 #8
Må jeg spørge hvad forskellen på et array og en collection er. Spå vidst jeg ved kan man også benytte Collection til at iretere gennem objekter på sin form.
Avatar billede havmaage Juniormester
11. februar 2003 - 22:06 #9
Hvilken metode er bedst sådan rent memory mæssigt. Hvad hvis man har 20000 records og man anvender Collection ? etc..
Avatar billede somaliomar Praktikant
11. februar 2003 - 22:08 #10
Ups... Der var vist lidt for hurtigt :)
Avatar billede bernhof Nybegynder
11. februar 2003 - 22:19 #11
havmaage > jeg mener en collection kan klare nærmest uanede mængder .. Når du når op i meeeget høje tal, tror jeg dog at det ikke er så hukommelsesvenligt..

Men hvis du fylder 20000 records i en array på jørn's metode, udfører du også ReDim Preserve 20000 gange, og det er MEGET slemmere for hukommelsen, da ReDim Preserve er en meget ressourcekrævende funktion.
Avatar billede havmaage Juniormester
11. februar 2003 - 23:10 #12
Jeg overvejer hvilket eksemple jeg vil bruge men begge virker fint. Somalioar tak for dit svar, men som du selv er inde på var de andre besvarelser mere fyldestgørende i forhold til hvad mit spørgsmål gik ud på, måske vi lærte noget begge :-) håber vi er cool selvom du ikke for point i denne omgang.

Simon
Avatar billede somaliomar Praktikant
11. februar 2003 - 23:13 #13
Jeg har ihvertfald lært noget af det :)
Avatar billede brobaek Nybegynder
12. februar 2003 - 10:16 #14
Du kan evt. anvende jørns metode men køre en redim preserve før do/loop løkken starter. Brug fx rs.count eller kør do/loop igennem for at finde antal records.

Et array yder bedre perfomance til tal en collections - men mikbj har ret i, at helst ikke skal ligge indenfor løkken.
Avatar billede joern Nybegynder
12. februar 2003 - 11:06 #15
Hej.

Brobaek's forslag er udmærket.  Jeg har et array på omkring 1500 poster på Win98,  1 Ghz og 512 MB ram.  Det tager ingen tid, men det fylder så sikkert unødigt op.
Det vil jeg prøve at ændre så ReDim Preserve kommer uden for løkken.

M.v.h.  Jørn
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester