Newsgroup: it.comp.lang.c++
Titolo: Problema STL

Salve a tutti,
ho un problema con una lista... 
Pasto il codice e poi spiego il problema ;p
list<unsigned char[6]> *list; // Puntatore alla lista
list<unsigned char[6]>::iterator l; // Iteratore
// Dati di prova
unsigned char buf[6] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06 };
list = new list<unsigned char[6]>; // Creo la lista
l = list->begin(); // Inizializzo l'iteratore
list->push_back(buf); // Metto i dati nella lista
E fin qui tutto bene, i dati sembrano essere inseriti correttamente...
Il problema arriva quando devo leggerli, perche' devo prendere
gli elementi dell'array uno a uno... Ho provato cosi:
while(l != list->end()){
        printf("Test: %x", *(*l + 1));
        l++;
}
In questo modo _dovrebbe_ leggere l'elemento list<[1]>... Ma non va, ho
provato allora con: printf("Test: %x", (*l)[1]) ma non va... Ho tentato
anche con qualcosa di piu' esotico ;p:
printf("Test: %x", *(unsigned char *)(&l + 1))
Ok, gli ultimi due tentativi erano proprio disperati... Ma veramente non
riesco a leggere l'array che fa parte di ogni elemento della lista...
Qualcuno puo' indicarmi la retta via? Vi ringrazio molto.
Bonzo

 }
per ogni elemento della lista:
unsigned char* buf = *l;
a questo punto buf[0] ... buf[5] dovrebbe contenere ( non ho provato )
quello che stai cercando.
Un consiglio non dare alle variabili gli stessi nomi dei tipi, si
fa una confusione pazzesca.
G.

 list<unsigned char[6]>::iterator l; // Iteratore
In teoria questo codice non dovrebbe nemmeno compilare, dato che gli array 
non soddisfano il requisito 'Assignable' (cfr. [23.1.2-3]), e nemmeno il 
requisito 'CopyConstructible', credo.
E in effetti il Comeau online non lo compila.
Soluzione: incorcopra l'array in una struct.
  struct array_6uc
  {
        unsigned char data [ 6 ];
  };
  std::list<array_6uc> *list; // Puntatore alla lista
  // ...
  array_6uc buf[6] = { { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06 } };
  // ...
       printf("Test: %x", *( (*l).data + 1 ) );
  // oppure
       printf("Test: %x",  (*l).data[1] ) ;
Max

 fa una confusione pazzesca.
Si hai ragione, i nomi originali erano diversi e li avevo cambiati per
rendere il codice piu' "leggibile" ma non mi ero accorto di aver chiamato
la lista list ;p.
Grazie comunque. Buona domenica.
Bonzo

        printf("Test: %x",  (*l).data[1] ) ;
Ciao max e grazie mille anche a te, non ci crederai ma neanche cosi
funziona, il primo metodo non compila il secondo invece accede a qualche
altra area di memoria che veramente non capisco.... A questo punto mi
chiedo se non sia un bug del gcc.....
Grazie tante.
Bonzo

 chiedo se non sia un bug del gcc.....
Mostra il codice che hai usato, per piacere. Io l'ho provato con diverse 
versioni del GCC (2.91,2.95,3.0.4) e non ho riscontrato problemi.
Max

 versioni del GCC (2.91,2.95,3.0.4) e non ho riscontrato problemi.
Ups, ti chiedo scusa, avevo sbagliato un'inizializzazione, quindi il secondo
metodo da te descritto funziona a dovere... 
Ora pero' mi chiedo una cosa, ho passato ad un amico che ha windows il mio
sorgente e ha detto che il Visual C++ non lo compila perche' non accetta la
definizione di <unsigned char[6]>, mentre il gcc lo compila... E' un bug?
Grazie tante max, se non fosse stato per te chissa' ancora quanto ci avrei
perso su questo problema :)
Bonzo