[VB6] Array maken

Pagina: 1
Acties:

  • DarkSilence
  • Registratie: December 2002
  • Laatst online: 19-12-2025

DarkSilence

W3designer.nl

Topicstarter
Ik wil een array maken waar ik met een do...loop functie iets in kan opslaan.

Ik wil graag een byte per keer opslaan als een byte in de array. De lengte verschilt per keer van de for next functie. Mischien de ene keer maar lieft 1000 keer en de andere keer maar 50 keer dat de opracht zich herhaalt. Dus de array moet dynamisch zijn en er moet een byte in op geslagen kan worden.

Ik heb zelf van arrays weinig verstand ik heb meerdere dingen geprobeerd. Op google en GoT gezocht en helaas niets gevonden
code:
1
2
3
4
Do While Not EOF(Fnum)
            Get #Fnum, , TempByte
            ' de TempByte moet hier wordenb op geslagen in de array
Loop

Op internet vond ik veel dingen zoals dit
code:
1
Dim Voorbeeld(100) as byte

heb ik dus niets aan dat kon ik zelf ook wel verzinnen. Weet iemand hoe ik het aan moet pakken heel graag...

Bijvoorbaat dank

W3designer.nl


  • pjonk
  • Registratie: November 2000
  • Laatst online: 29-12-2025
Met Redim kun je een variabele grootte aan een array geven.

Met Redim Preserve kun je meer geheugen reserveren voor je array zonder dat de oorspronkelijke inhoud verloren gaat. Dit is handig als je niet van te voren weet hoe groot je array moet worden.

Even een voorbeeld:
code:
1
2
3
4
5
6
7
8
9
10
11
12
Dim tabel() as String

' Maak array 5 
Redim tabel(3)
tabel(0) = "hallo"
tabel(1) = "hoi"
tabel(2) = "doei"
tabel(3) = "blaat"

' Maak array nog groter zorg dat inhoud elementen 0,1,2 en 3 niet verloren gaat
Redim preserve tabel(4)
tabel(4) = "index 4"

[ Voor 40% gewijzigd door pjonk op 22-01-2003 22:02 ]

It’s nice to be important but it’s more important to be nice


  • Sponge
  • Registratie: Januari 2002
  • Laatst online: 15-08 11:47

Sponge

Serious Game Developer

Probeer dit eens:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Dim myArray() as Byte
Dim lngFreeFile as Long

lngfreefile = FreeFile

'//Open bestand
open filename for binary as #lngFreeFile
'//Redim array van 1 tot bestandsgrootte
redim myArray(1 To lof(lngfreefile))
'//Lees alle bytes in de array
Get #lngfreefile,,myarray

'//Sluit file
Close #lngfreefile



De hele file zit nu in je (byte-)array! Dit is overigens een van de snelste (zo niet de snelste) manier van files gebruiken in VB...

[ Voor 3% gewijzigd door Sponge op 22-01-2003 22:34 . Reden: Haakje vergeten te sluiten :P ]


  • DarkSilence
  • Registratie: December 2002
  • Laatst online: 19-12-2025

DarkSilence

W3designer.nl

Topicstarter
Oké bedankt werkt geweldig!!! :*) :*) :*)

hier ff de code zowel open als opslag code:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Dim ByteArray() As Byte

Private Sub Command1_Click()
    Dim Fnum As Integer
    Fnum = FreeFile

    Open "C:\test.bmp" For Binary As Fnum
        ' Redim array van 1 tot bestandsgrootte
        ReDim ByteArray(1 To LOF(Fnum))
        ' Lees alle bytes in de array
        Get Fnum, , ByteArray
    Close Fnum
End Sub

Private Sub Command2_Click()
    Dim Fnum As Integer
    Fnum = FreeFile

    Open "C:\test2.bmp" For Binary As Fnum
        'Get Fnum, , ByteArray
        Put Fnum, , ByteArray
    Close Fnum
End Sub

W3designer.nl


  • ZaZ
  • Registratie: Oktober 2002
  • Laatst online: 07-07 01:04

ZaZ

Tweakers abonnee

Zoals je het nu hebt schrijf je eerst het bestand in je geheugen, en pas als je op de 2e knop drukt schrijf je het weg naar een file.
Dat is niet de mooiste methode imho.
Je zou m ook eventueel in chunks (blokken) kunnen inlezen en meteen weer wegschrijven.

Hieronder een lapje code wat de tijd opmeet:
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
Option Explicit
Const Chunksize = 50000
Dim lRemainder As Long, lStartpos As Long, lChunkcount As Long
Dim bArray() As Byte
Dim lFreeFile1 As Long, lFreeFile2 As Long
Dim sFileSource As String, sFileDest As String
Dim i As Integer
Dim lTijd As Long, lTijd2 As Long
Private Sub Command1_Click()
'//Dit is ongeveer de methode zoals hierboven zonder comments
lTijd = Timer
sFileSource = "c:\temp\test.exe"
sFileDest = Left(sFileSource, Len(sFileSource) - 4) & " zonder chunks" & Right(sFileSource, 4)
lFreeFile1 = FreeFile
Open sFileSource For Binary Access Read As #lFreeFile1
  lFreeFile2 = FreeFile
  Open sFileDest For Binary Access Write As #lFreeFile2
    ReDim bArray(LOF(lFreeFile1) - 1)
    Get #lFreeFile1, , bArray
    Put #lFreeFile2, , bArray
  Close #lFreeFile1
Close #lFreeFile2


'//En hier komt nu een simpele methode om het bestand in blokken in een array te stoppen

'//Om de tijd op te meten hoe lang het duurt
lTijd2 = Timer
'// de eerste file
sFileSource = "c:\temp\test.exe"
'// het doelbestand
sFileDest = Left(sFileSource, Len(sFileSource) - 4) & " in chunks" & Right(sFileSource, 4)
lFreeFile1 = FreeFile
'//Open het source bestands om te lezen
Open sFileSource For Binary Access Read As #lFreeFile1
  lFreeFile2 = FreeFile
  '//en open het doelbestand om te schrijven
  Open sFileDest For Binary Access Write As #lFreeFile2
    '//Kijk in hoeveel 'blokken' je het bestand moet kopieeren
    lChunkcount = LOF(lFreeFile1) \ Chunksize
    '//En dit is wat overblijft
    lRemainder = LOF(lFreeFile1) Mod Chunksize
    '//FF de startpositie op 1 zetten
    lStartpos = 1
    '//Redim de array tot de chunksize
    ReDim bArray(Chunksize)
    '//Een for loop maken met hoe vaak ie een blok moet lezen
    For i = 1 To lChunkcount
      '//Lees een chunk van de sourcefile in
      Get #lFreeFile1, lStartpos, bArray
      '//En schrijf m weg
      Put #lFreeFile2, lStartpos, bArray
      '//Vergroot de startpositie
      lStartpos = lStartpos + Chunksize
    Next
    '//Nu nog de array redimmmen naar het overblijfsel
    ReDim bArray(lRemainder - 1)
    '//En weer lezen en wegschrijven
    Get #lFreeFile1, lStartpos, bArray
    Put #lFreeFile2, lStartpos, bArray
  '//En de boel weer sluiten :)
  Close #lFreeFile1
Close #lFreeFile2
'//En hier de tijd laten zien
MsgBox "Alles in een array duurt het " & Timer - lTijd & " seconden." & vbCrLf _
    & "En in in 'chunks' van " & Chunksize & " duurt het " & Timer - lTijd2 & " seconden."
End Sub


bij mij duurt het in 1 array met een bestand van 140 mb 20 sec en in blokken 11 sec.
Dus het is wel de moeite waard met veel grote bestanden.
De grootte van de chunks moet je wel weer aanpassen aan de grootte van het bestand om het optimale eruit te halen dacht ik, wat die formule daarvoor is weet ik niet. Dus het kan ook heel goed zijn dat dit niet helemaal optimaal is nog.

Lekker op de bank


  • DarkSilence
  • Registratie: December 2002
  • Laatst online: 19-12-2025

DarkSilence

W3designer.nl

Topicstarter
Is wel beter misschien ga ik die code wel gebruiken, in iedergeval bedankt. _/-\o_

W3designer.nl


  • DarkSilence
  • Registratie: December 2002
  • Laatst online: 19-12-2025

DarkSilence

W3designer.nl

Topicstarter
Weet iemand hoe je de lengte van een array kan op vragen. Dus stel voor ik heb in de array 10 strings opgeslagen. Maar dat weet ik zelf niet. Hoe zou ik dat op kunnen vragen?

Ik heb de array gemaakt met
dim varnaam() as string

redim varnaam(10)

Zodat ik dus de lengte op kan vragen en heel makkelijk de array kan vergroten met 1 string extra

W3designer.nl


Verwijderd

De 'lengte' vraag je op met:

code:
1
UBound(varnaam)

  • Sponge
  • Registratie: Januari 2002
  • Laatst online: 15-08 11:47

Sponge

Serious Game Developer

Verwijderd schreef op 24 January 2003 @ 16:48:
De 'lengte' vraag je op met:

code:
1
UBound(varnaam)
Werkt echter alleen als er minimaal 1 item in de array zit..

  • DarkSilence
  • Registratie: December 2002
  • Laatst online: 19-12-2025

DarkSilence

W3designer.nl

Topicstarter
Ja klopt maar ik had dat ook al ondekt, maar ik kan ubound gelukkig wel gebruiken voor mijn code. Duzzzzzzz allemaal bedankt!!! 8)

W3designer.nl

Pagina: 1