Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Problema con puntatori e cast in C

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

0
voti

[1] Problema con puntatori e cast in C

Messaggioda Foto UtenteLucast85 » 23 gen 2015, 19:15

Ciao a tutti,
non riesco a capire perché il seguente codice stampa a video due stringhe differenti contenute nella stessa porzione di memoria. Cerco di semplificare il problema trascrivendo solo le parti interessanti del codice.
Codice: Seleziona tutto
typedef struct{
   uint32_t ui32MsgID;
   uint32_t ui32MsgIDMask;
   uint32_t ui32Flags;
   uint32_t ui32MsgLen;
   uint8_t* pui8MsgData;
}CANMsgObject_t;

uint64_t msgdata[MSG_LENGTH];

for(i=0x00;i<PACKETS_NO;i++){
      msgdata[i]= 0x0101010101010101 * i;   // fill the 8 bytes content with its vector index number
   }

uint64_t* pui64_msg = msgdata;

sCANMsgObject[MsgVectorLastIndex].ui32MsgID = CANMSG_ID;
sCANMsgObject[MsgVectorLastIndex].ui32MsgIDMask = 0;
sCANMsgObject[MsgVectorLastIndex].ui32Flags = MSG_OBJ_TX_INT_ENABLE;
sCANMsgObject[MsgVectorLastIndex].ui32MsgLen = CANByteOnLastPacket;
sCANMsgObject[MsgVectorLastIndex].pui8MsgData = (uint8_t*)&pui64_msg[MsgVectorLastIndex];

/* DEBUG CODE START */
printf("the content of memory address pointed by pui64_msg[%d] is: I64X\n",MsgVectorLastIndex,pui64_msg[MsgVectorLastIndex]);
printf("*sCANMsgObject[%d].pui8MsgData is: %I64X\n",i,*sCANMsgObject[MsgVectorLastIndex].pui8MsgData);
/* DEBUG CODE END */

Le ultime righe dovrebbero (IMHO) stampare lo stesso valore, ossia il contenuto dell'ultimo elemento del vettore msgdata che è pari a 0x1F1F1F1F1F1F1F1F. In realtà il valore restituito dalla seconda "printf" è diverso:
Codice: Seleziona tutto
the content of memory address pointed by pui64_msg[31] is: 1F1F1F1F1F1F1F1F
*sCANMsgObject[31].pui8MsgData is: 1F1F1F1F0000001F

Credo di aver utilizzato in maniera non corretta il "type casting" o che il problema sia dovuto ad una diversa dimensione del puntatore. Tenete presente che la struttura dati nelle prime righe del codice è stata fornita con delle librerie quindi il puntatore "uint8_t* pui8MsgData;" non può essere modificato.
Che cosa è successo secondo voi? Come posso risolvere ?
P.S. il codice è stato compilato con MINGW32 (usa GCC) su PC con i7 e Windows 8.1 64bit.
In realtà è la porzione di FW per un evaluation kit della Texas Instuments che sto provando su PC preventivamente.

Grazie a tutti in anticipo, O_/ O_/
Avatar utente
Foto UtenteLucast85
125 2 8
Frequentatore
Frequentatore
 
Messaggi: 189
Iscritto il: 13 nov 2009, 16:34
Località: MC

0
voti

[2] Re: problema con puntatori e cast in C

Messaggioda Foto UtenteLucast85 » 23 gen 2015, 20:59

Dovrei aver capito. Facendo il debug mi sono accorto che in realtà *sCANMsgObject[31].pui8MsgData vale 0x1F.
Sembra che la printf dia "1F1F1F1F0000001F" perché tiene conto di tutti e 64 bit (infatti come specificatore di tipo ho messo %I64X). I primi 4 byte (LSB) sono sovrascritti mentre (gli MSB) no.
In realtà solo i primi 8 bit sono quelli significativi perché il puntatore a cui ho applicato il "cast" ad "uint8_t" è assegnato alla variabile della struttura CANMsgObject_t, come segue:
Codice: Seleziona tutto
sCANMsgObject[MsgVectorLastIndex].pui8MsgData = (uint8_t*)&pui64_msg[MsgVectorLastIndex];
che è appunto di tipo "uint8_t*"
Avatar utente
Foto UtenteLucast85
125 2 8
Frequentatore
Frequentatore
 
Messaggi: 189
Iscritto il: 13 nov 2009, 16:34
Località: MC


Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 7 ospiti