Posto il codice vero.
Uno dei marker si chiama DHT (Define Huffman Table).
Contiene una struttura dati che serve alla classe principale che si chiama JpegHeader.
Ecco la definizione di DHT:
codice:
class Dht {
public:
Dht();
Dht(fstream &fs);
int Extract(fstream &in);
void printBinaryCodes();
void printData();
vector<HuffmanTable> huffmanTables;
};
La funzione Extract elabora il filestream dentro al costruttore e inizializza il vettore huffmanTables. Le altre funzioni stampano dati utili.
HuffmanTable è una struttura dati così definita:
codice:
typedef struct ht {
unsigned char valuesPerLength[16];
unsigned char* values;
unsigned short int* codes;
unsigned char Tc;
unsigned char Th;
} HuffmanTable;
values e codes sono array di interi dinamicamente allocati al momento della costruzione tramite malloc.
Alla classe JpegHeader serve che sopravviva l'istanza di Dht perchè gli serve il vettore huffmanTables per elaborazioni successive.
Il costruttore di Dht da me definito prende per reference un fstream con la testina già posizionata ad un certo punto e inizializza il vettore huffmanTables.
Dentro la classe JpegHeader c'è il famoso switch case di cui il case d'interesse è il seguente:
codice:
switch ((b & 0x0F)) {
// DHT
case 0x04:
{
cout << "Trovata la tabella di Huffman" << endl;
Dht eh(file);
tabelle = eh.huffmanTables;
file è l'fstream, eh è l'istanza temporanea, tabelle sarebbe un vettore di JpegHeader.
Ho provato inoltre a fare:
codice:
tabelle = new Dht(file);
con tabelle dichiarato come puntatore a Dht e anche a fare
codice:
Dht eh(file);
tabelle = eh;
con tabelle dichiarato come dato Dht
Il problema è del tutto analogo con altre classi deputate a interpretare altri marker.