Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1

    [C++] uint32_t misteriosamente cambia valore

    Ciao a tutti.
    Mi trovo ad affrontare un problema che non capisco... ho creato questa struttura:
    codice:
    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...):
    codice:
    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
    warcomeb - IL LEADER O.O.O.

  2. #2
    Utente di HTML.it L'avatar di linoma
    Registrato dal
    Mar 2010
    Messaggi
    1,346
    Puo darsi che sia un valore sporco gia contenuto nella struttura. E' riempita di 0?
    Per gli Spartani e Sparta usa spartan Il mio github

  3. #3
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480

    Re: [C++] uint32_t misteriosamente cambia valore

    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" ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  4. #4
    P.S. In che lingua è "pachet" ? Semmai "packet" ...
    Per fortuna non se n'è accorto il prof...

    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
    warcomeb - IL LEADER O.O.O.

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    cosa può essere?
    Finché non rispondi alle domande che ti ho posto ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  6. #6
    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
    warcomeb - IL LEADER O.O.O.

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Prova ad inserire all'inizio del codice sorgente la direttiva

    #pragma pack(1)
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  8. #8
    Utente di HTML.it L'avatar di linoma
    Registrato dal
    Mar 2010
    Messaggi
    1,346
    E' corretto union? *_type che tipo sono?
    Per gli Spartani e Sparta usa spartan Il mio github

  9. #9
    Originariamente inviato da linoma
    E' corretto union? *_type che tipo sono?
    sono tutti tipi definiti da me...

    codice:
    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
    warcomeb - IL LEADER O.O.O.

  10. #10
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    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 ...)
    No MP tecnici (non rispondo nemmeno!), usa il forum.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.