Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Visual Basic 6 - istruzione redim
Forum - Visual Basic 6 - istruzione redim

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 1:00
Giovedì, 01/01/1970
eccomi a porre un nuovo quesito.....
sto' usando la funzione redim che mi incrementa la matrice di variabili, questo pero' mi carica lmemoria, questa funzione viene richiamata piu' volte in maniera ciclica, e le variabili allocate in memoria non vengono mai cancellate aumentando di continuo ed esaurendo la memria......
ci sarebbe il modo esaurito un ciclo di di far tornare la matrice di variabili alle dimensioni originali in modo che liberi la memoria, cosi' al prossimo utilizzo riparta da 0?

PM Quote
Avatar
GrG (Member)
Guru^2


Messaggi: 3430
Iscritto: 21/08/2007

Segnala al moderatore
Postato alle 21:52
Venerdì, 30/01/2009
ma non puoi riscrivere sui dati precedenti?

mostra un esempio per capire meglio...

PM Quote
Avatar
theprogrammer (Normal User)
Guru^2


Messaggi: 2509
Iscritto: 28/01/2009

Segnala al moderatore
Postato alle 10:42
Sabato, 31/01/2009
Se usi la Redim per "incrementare" la memoria e' perche' hai bisogno di MAGGIORE memoria ...

Ma se non hai bisogno di MAGGIORE memoria, allora stai usando la Redim senza averne bisogno ...

PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 12:37
Sabato, 31/01/2009
Codice sorgente - presumibilmente VB.NET

  1. Public Function GetMD5(sFile$) As String
  2.     Dim hFile&, uBuffer() As Byte, lFileSize&, lBytesRead&, uMD5(lMD5Length) As Byte
  3.     Dim i&, hCrypt&, hHash&, sMD5$
  4.    
  5.     'Get a handle to the file
  6.     hFile = CreateFile(sFile, GENERIC_READ, FILE_SHARE_READ, ByVal 0&, OPEN_EXISTING, ByVal 0&, ByVal 0&)
  7.    
  8.     'Check if file opened successfully
  9.     If hFile > 0 Then
  10.         'Get the file size
  11.         lFileSize = GetFileSize(hFile, ByVal 0&)
  12.    
  13.         'File size must be greater than 0
  14.         If lFileSize > 0 Then
  15.             'Prepare the buffer
  16.             ReDim uBuffer(lFileSize - 1)
  17.             'Read the file
  18.             If ReadFile(hFile, uBuffer(0), lFileSize, lBytesRead, ByVal 0&) <> 0 Then
  19.                 If lBytesRead <> lFileSize Then
  20.                     ReDim Preserve uBuffer(lBytesRead - 1)
  21.                 End If
  22.                
  23.                 'Acquire the context, create the hash, and hash the data
  24.                 If CryptAcquireContext(hCrypt, vbNullString, vbNullString, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT) <> 0 Then
  25.                     If CryptCreateHash(hCrypt, CALG_MD5, 0&, 0&, hHash) <> 0 Then
  26.                         If CryptHashData(hHash, uBuffer(0), lBytesRead, ByVal 0&) <> 0 Then
  27.                             If CryptGetHashParam(hHash, HP_HASHVAL, uMD5(0), lMD5Length, 0) <> 0 Then
  28.                                 'Build the MD5 string
  29.                                 For i = 0 To lMD5Length - 1
  30.                                     sMD5 = sMD5 & (Right$("0" & Hex$(uMD5(i)), 2))
  31.                                 Next i
  32.                             End If
  33.                         End If
  34.  
  35.                         'Destroy the hash
  36.                         CryptDestroyHash hHash
  37.                     End If
  38.                    
  39.                     'Release the context
  40.                     CryptReleaseContext hCrypt, 0
  41.                 End If
  42.             End If
  43.         End If
  44.        
  45.         'Close the handle to the file
  46.         CloseHandle hFile
  47.     End If
  48.      
  49.     'Convert to lower case
  50.     GetMD5 = LCase$(sMD5)
  51. End Function



non ho bisogno di incrementare la memoria, ma di  incrementare la variabile " ubuffer() " che inevitabilmente occupa memoria, dovrei riuscire a svuotare la variabile alla fine della funzione.....
una variabile in vb si puo' svuotare usando il nothing....ma in questo caso non mi riesce di usarlo.....

se qualcuno ha qualche idea bene accetta.....
  

PM Quote
Avatar
theprogrammer (Normal User)
Guru^2


Messaggi: 2509
Iscritto: 28/01/2009

Segnala al moderatore
Postato alle 13:34
Sabato, 31/01/2009
Testo quotato

Postato originariamente da muteblaster:
non ho bisogno di incrementare la memoria, ma di  incrementare la variabile " ubuffer() " che inevitabilmente occupa memoria



Quindi, che differenza c'e' con quello che ti ho detto?

Testo quotato


dovrei riuscire a svuotare la variabile alla fine della funzione.....



Non e' affatto necessario.

Quell'array di byte e' locale alla funzione.
Al termine della funzione, non esiste piu'.

Testo quotato

una variabile in vb si puo' svuotare usando il nothing....



Non c'entra nulla ... il nothing non serve a "svuotare" nulla ma per distruggere per le istanze di una classe (per gli oggetti) ... non e' questo il caso.

Testo quotato

ma in questo caso non mi riesce di usarlo.....



E infatti non c'entra nulla.

In conclusione, non devi fare niente.
    

Ultima modifica effettuata da theprogrammer il 31/01/2009 alle 13:35
PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 17:12
Sabato, 31/01/2009
se io faccio lo hash di un singolo file non ho problemi , ma se lo faccio di molti file , per esempio di una intera diretory mi da errore di memoria esaurita.....


PM Quote
Avatar
theprogrammer (Normal User)
Guru^2


Messaggi: 2509
Iscritto: 28/01/2009

Segnala al moderatore
Postato alle 17:46
Sabato, 31/01/2009
Ogni volta che la funzione termina, la memoria viene restituita.

L'errore che hai e' solo perche' si sta tentando di trattare un file molto grande e non e' possibile allocare tutta la memoria.

Quando hai quell'errore, prova a vedere quale file stava trattando e quanto era grande.

PM Quote
Avatar
GrG (Member)
Guru^2


Messaggi: 3430
Iscritto: 21/08/2007

Segnala al moderatore
Postato alle 18:53
Sabato, 31/01/2009
come dice theprogrammer alla fine della funzione ubuffer (o come si kiamava) viene distrutto automaticamente...mi pare ke la funzione accetti un solo file alla volta...quindi come fai a "dargli" un'intera directory?
io penso che in un button ci metti tipo un ciclo magari anche crazie ai componente filebox e dirbox però se prendi un file alla volta significa (come dice theprogrammer) che richiami la funzione, ubuffer si riempie, la funzione finisce, la variabile ubuffer smette di esistere xk viene distrutta. Quindi non è il problema che in ubuffer si accumula sempre + roba perchè ogni volta parte da 0. Quindi si tratta di un file troppo grande da aprire e come giustamente dice theprogrammer dicci (quando ti da l'errore) a che file stava soprattutto alle dimensioni del file a cui si è fermato...

PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 7:17
Domenica, 01/02/2009
avete perfettamente ragione.....
mi da l'errore su un file da 600 mb......
avete qualche idea su come risolvee il problema?....


PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo