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?
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.