Orario: 22-05-2013, 5:32 Benvenuto ospite! (Log inRegistrati)


Rispondi 
vc++ non digerisce zlib
Autore Messaggio
Jak
Vaporizator

Messaggi: 471
Registrato: Jul 2011
Offline Offline
#1 vc++ non digerisce zlib
0
Stavo studiando zlib per comprimere varie cose(dati nella ram che tengo da parte ma letti poco spesso, file, ecc) e, tra le altre funzioni, mi ritrovo le bellissime compress e uncompress che in poche parole comprimono un'array di char e ti restituisce l'array compresso e la sua lunghezza quindi ciò che fa al caso mio.

Tra i vari test in c++ ho sempre avuto svariati problemi di eccezioni molto strani così son passato a scrivere in C pensando ad un qualche problema di compatibilità con zlib ma il risultato è sempre lo stesso: errore di violazione di accesso.
In genere in tutto il periodo di tempo che ho usato vc++ ho capito che violazione di accesso sta a dire quando cerchi di usare trucchetti per leggere la memoria che non è stata allocata dal programma.
Non mi sono andato a guardare come funzionano internamente quelle funzioni poichè non sono molto esperto di compressione dei dati ma l'eccezione viene causata da quelle funzioni, probabilmente perchè allocano memoria per conto loro e mi passano il puntatore.
La cosa più strana è che inizializzando l'array di char con una stringa non mi da alcun problema mentre leggendo i dati da file e quindi usando memoria allocata in tempo reale non ne vuole sapere di lasciar fare ciò che quella funzione è destinata a fare.
Ho provato un po di tutto dal copiare la stringa su un'altra variabile ad usare fstream in c++ o le funzioni per i file in C ma niente. Sono passato quindi a modificare le impostazioni di vc++ disattivando eccezioni e controllo sui buffer ma continua a darmi problemi.

Non so più dove sbattere la testa, avete idee? Hmm

Codice esempio di una funzione che ho fatto in c++ per comprimere un file(abbozzata per via delle varie trasformazioni che ho fatto per testare)
Codice:
double CompressFile(char* file_input, char* file_output)
{
        ifstream is;
    ofstream os;
    is.open (file_input, ios::binary );
    os.open (file_output, ios::binary );

    // get length of file:
    is.seekg (0, ios::end);
    uLongf length = is.tellg();
    is.seekg (0, ios::beg);

    // allocate memory:
    char* a = new char [length];
    char* b;
    uLongf blength;

    is.read (a,length);
    is.close();

    compress((Bytef*) b, (uLongf*) &blength, (Bytef*)a, length);

    os.write(b, blength);
    os.close();
    return 0;
}
Anche convertita in C il risultato è lo stesso.

se prima di usare compress faccio ad esempio a="asd"; length = 4; non da alcun problema ma ovviamente, specialmente se leggo da file, non posso decidere la grandezza dell'array al momento della compilazione.

La uso semplicemente così
Codice:
void main()
{
    CompressFile("C:\\Users\\Jak\\Desktop\\GM_NJZlib\\test_file.txt", "C:\\Users\\Jak\\Desktop\\GM_NJZlib\\file_compresso.txt");
}

La libreria zlib l'ho compilata sempre usando vc++ dal source ed ho provato a disattivare eccezioni e controlli anche su quella ma niente.
10-06-2012 19:07
Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
TheCrib
Indie Pellerossa

Messaggi: 5,183
Registrato: Sep 2010
Offline Offline
#2 RE: vc++ non digerisce zlib
0
Da: http://zlib.net/manual.html#Utility

Citazione:ZEXTERN int ZEXPORT compress OF((Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen));

Compresses the source buffer into the destination buffer. sourceLen is the byte length of the source buffer. Upon entry, destLen is the total size of the destination buffer, which must be at least the value returned by compressBound(sourceLen). Upon exit, destLen is the actual size of the compressed buffer.

Quindi:

Codice:
void CompressToVector( std::vector<Bytef> &destBuff, const Bytef *pSource, uLongf sourceLen )
{
    destBuff.resize( compressBound(sourceLen) );
  
    uLongf destLen = destBuff.size();
    compress( &destBuff[0], &destLen, pSource, sourceLen );

    destBuff.resize( destLen );
}

La memoria di destinazione devi allocarla tu e devi anche specificare quanto e' grosso quel buffer.

Davide Pasca
http://v5.kazzuya.com - @109mae
http://oyatsukai.com - @oyatsukai
"O frechete !" - M.Magnotta
10-06-2012 19:30
Visita il sito web di questo utente Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
Jak
Vaporizator

Messaggi: 471
Registrato: Jul 2011
Offline Offline
#3 RE: vc++ non digerisce zlib
0
Bambini, ricordate le lezioni di vita di zio Jak. Quando a scuola vi insegnano l'inglese e a voi non piace non fate come lui, studiatelo!!!

Grazie crib, come al solito la mia unità di traduzione fa cilecca Facepalm
Mi sto cimentando nell'autoflagellazione con il gatto a nove code per punizione di aver fatto una domanda così stupida(e sopratutto per averci sbattuto la testa da stamattina Dead )
10-06-2012 20:06
Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
TheCrib
Indie Pellerossa

Messaggi: 5,183
Registrato: Sep 2010
Offline Offline
#4 RE: vc++ non digerisce zlib
0
Di nulla.. ..va detto che come interfaccia non e' il massimo, io sono andato a colpo sicuro perche' ci ho sbattuto la testa in passato 8)

In ogni caso, spesso quando si tratta di funzioni che hanno un output di dimensione variabile, si usa passare un puntatore ad un area di memoria (preallocata) ed un puntatore tipo destLen, che in input indica la dimensione massima del buffer ed in output riporta la dimensione usata.

E' una cosa un po' ambigua ma ci si fa il callo.

In generale in oltre e' naturale che queste funzioni non allochino la memoria da se, perche' la gestione della memoria e' meglio lasciata all'applicazione che potrebbe ad esempio usare un buffer fisso o comunque allocato in altri modi.

Per allocare nella heap invece, piuttosto che new[] o malloc(), consiglio di usare std::vector<> quando possibile.. ..ha il gran vantaggio di rilasciare la memoria automaticamente (al distruttore) e quando la si usa come array (in debug mode), c'e' anche un check sullo sconfinamento.. che tende ad essere una frequente fonte di bugs.

Davide Pasca
http://v5.kazzuya.com - @109mae
http://oyatsukai.com - @oyatsukai
"O frechete !" - M.Magnotta
10-06-2012 21:46
Visita il sito web di questo utente Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
Skad
Junior Member

Messaggi: 2
Registrato: Oct 2012
Offline Offline
#5 RE: vc++ non digerisce zlib
0
Ciao,
sono nuovo del forum, qualcuno saprebbe postare dei link dove viene spiegata l'elaborazione effettuata da Microsoft e Nite sulle mappe di profondità al fine di ottenere, ad alto livello, il riconoscimento dei gesti e dello scheletro dell'utente?
25-10-2012 18:06
Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
hjeldin
bananarama operative

Messaggi: 685
Registrato: Jan 2011
Offline Offline
#6 RE: vc++ non digerisce zlib
0
non converrebbe aprire un altro thread a parte? O.o

Riccardo Arena
Actionscripttaro da 3.0 soldi e winner di contest Microsoft come unico partecipante Asd


dev/whatever blog

portfolio
25-10-2012 18:52
Visita il sito web di questo utente Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
Rispondi 


Vai al forum: