PDA

Visualizza la versione completa : [C++] Variabile uint32_t misteriosamente cambia valore


warcomeb
20-09-2011, 18:29
Ciao a tutti.
Mi trovo ad affrontare un problema che non capisco... ho creato questa struttura:


typedef union {
uint8_t bitmap [15];
struct {
time_type start_time;
day_type start_day;
time_type stop_time;
day_type stop_day;
frequency_type frequency;
uint8_t voltage;
uint32_t dimension;
} fs_entries_type;


riempio l'array bitmap ad esempio con questi valori (che ricevo dall'usb...):


Receive pachet n. 0, value: 0x04
Receive pachet n. 1, value: 0x2D
Receive pachet n. 2, value: 0x17
Receive pachet n. 3, value: 0x12
Receive pachet n. 4, value: 0x04
Receive pachet n. 5, value: 0xAD
Receive pachet n. 6, value: 0x17
Receive pachet n. 7, value: 0x12
Receive pachet n. 8, value: 0x20
Receive pachet n. 9, value: 0x01
Receive pachet n. 10, value: 0x05
Receive pachet n. 11, value: 0x00
Receive pachet n. 12, value: 0x00
Receive pachet n. 13, value: 0x6D
Receive pachet n. 14, value: 0xDF


ora perchè il campo dimension assume il valore: BFDF6D00??? BF dove lo ha trovato? e dato che quei dati mi provengono da una macchina bigendian li devo trasformare in little endian e quindi uso htonl e il campo vale: 6DDFBF... ma da dove cavolo proviene BF???

sbaglio qualcosa?
grazie
Marco

linoma
20-09-2011, 18:41
Puo darsi che sia un valore sporco gia contenuto nella struttura. E' riempita di 0?

oregon
20-09-2011, 18:47
Sei sicuro che tutti gli elementi (dal primo di tipo time_type all'ultimo ...) occupino 16 byte?

E poi, con quale compilatore stai lavorando?

Quale allineamento per le strutture usi per default ?



P.S. In che lingua è "pachet" ? Semmai "packet" ... :)

warcomeb
20-09-2011, 19:01
P.S. In che lingua è "pachet" ? Semmai "packet" ...
Per fortuna non se n'è accorto il prof... :shy:

I valori che ho stampato a video e che vi ho riproposto sono proprio quelli che vengono inseriti all'interno del bitmap e sono sicuro che gli altri occupano tutti 16bit dato che quando li analizzo riesco a parsarli bene.

cosa può essere?

Ciao
Marco

oregon
20-09-2011, 19:06
cosa può essere?

Finché non rispondi alle domande che ti ho posto ... :bhò:

warcomeb
20-09-2011, 19:15
hai ragione: sono su una macchina linux e compilo con gpp... per allineamento, scusa la domanda, cosa intendi (e come lo scopro quale è il default?)?

Ciao
Marco

oregon
20-09-2011, 19:24
Prova ad inserire all'inizio del codice sorgente la direttiva

#pragma pack(1)

linoma
20-09-2011, 19:25
E' corretto union? *_type che tipo sono?

warcomeb
20-09-2011, 19:41
Originariamente inviato da linoma
E' corretto union? *_type che tipo sono?

sono tutti tipi definiti da me...



typedef union {
uint16_t frequency;
struct{
uint16_t counter :12;
uint16_t unit :4;
}flags;
}frequency_type;

typedef union {
uint16_t time;
struct {
uint16_t minute : 6; /* 0 to 59 */
uint16_t hour : 5; /* 0 to 23 - 24hr format */
uint16_t padding : 4;
uint16_t unset : 1; /* This bit indicate that current time was not set. */
} flags;
} time_type;

typedef union {
uint16_t day;
struct {
uint16_t day : 5; /* 0 to 30 */
uint16_t month : 4; /* 0 to 11 */
uint16_t year : 6; /* 0 to 63 => 2000 to 2063 */
uint16_t unset : 1; /* This bit indicate that current day was not set. */
} flags;
} day_type;


per quanto riguarda la pragma provo a vedere se c'è ancora qualcuno in facoltà che può fare le prove con l'hardware, altrimenti domani mattina ti dico come è andata... ti chiedo solo una cosa:
questa direttiva serve per l'allineamento in memoria... quindi se avessi messo ad esempio 8 ed io avessi una struttura da 10, questa viene portata automaticamente a 16, mentre con 1 non ci sono avanzi di byte, giusto? ho capito bene?

Ciao
Marco

oregon
20-09-2011, 19:46
Originariamente inviato da warcomeb
... mentre con 1 non ci sono avanzi di byte ...

Corretto ...

Il problema dovrebbe essere che il compilatore inserisce un ulteriore byte nella struttura per rispettare l'allineamento (sarà 4 di default ...) e quindi la struttura diventa di 16 caratteri. Il risultato è che l'ultimo valore int a 32 bit "sfora" su un byte in memoria casuale che segue la struttura (che casualmente vale BF ...)

Loading