Problema con interi in un array di char
-
Devo fare una funzione che mi inserisce dei dati in un array di char (che poi invierò su seriale)
ciò che devo fare è questo
| T | P | 2 ¦ 3 | ....
in pratica nelle prime due posizioni ci sono dei caratteri, mentre nelle due seguenti ci devo mettere un intero di due byte (uno short).
altrove.. unsigned char tempoMsg[9];
createTempoMsg(tempoMsg)
void createTempoMsg(unsigned char tempoMsg[])
{
tempoMsg[0]=T_SIGN;
tempoMsg[1]=P_SIGN;
unsigned short* tempoMsgLength=(unsigned short*)(&tempoMsg[2]);
*tempoMsgLength=6;
...
}
facendo così però mi va a modificare tempoMsg[1] e ci mette 6;
Ho scoperto quindi che shiftando tutto di 1 e quindi scrivendo:
unsigned short* tempoMsgLength=(unsigned short*)(&tempoMsg[3]);
lo mette al posto giusto: ciò vuol dire che il puntatore punta all'ultima cella di memoria e non alla prima? che arcano è mai questo? ha a che fare con il big endian?
il problema è che seguendo questa logica (ovvero che i puntatori puntano all'ultima cella, il resto del programma non va e vado a leggere celle di memorie non valide...
idee?
PS: sto compilando con un gcc per piattaforme ARM con linux
-
Devo fare una funzione che mi inserisce dei dati in un array di char (che poi invierò su seriale)
ciò che devo fare è questo
| T | P | 2 ¦ 3 | ....
in pratica nelle prime due posizioni ci sono dei caratteri, mentre nelle due seguenti ci devo mettere un intero di due byte (uno short).
altrove.. unsigned char tempoMsg[9];
createTempoMsg(tempoMsg)
void createTempoMsg(unsigned char tempoMsg[])
{
tempoMsg[0]=T_SIGN;
tempoMsg[1]=P_SIGN;
unsigned short* tempoMsgLength=(unsigned short*)(&tempoMsg[2]);
*tempoMsgLength=6;
...
}
facendo così però mi va a modificare tempoMsg[1] e ci mette 6;
Ho scoperto quindi che shiftando tutto di 1 e quindi scrivendo:
unsigned short* tempoMsgLength=(unsigned short*)(&tempoMsg[3]);
lo mette al posto giusto: ciò vuol dire che il puntatore punta all'ultima cella di memoria e non alla prima? che arcano è mai questo? ha a che fare con il big endian?
il problema è che seguendo questa logica (ovvero che i puntatori puntano all'ultima cella, il resto del programma non va e vado a leggere celle di memorie non valide...
idee?
PS: sto compilando con un gcc per piattaforme ARM con linux
-
Dopo quasi 24h di sbattimenti ho capito che il cast dei puntatori non si può fare, perché non funziona come su windows...
la funzione memcpy invece funziona, usero quella
Ciao! Sembra che tu sia interessato a questa conversazione, ma non hai ancora un account.
Stanco di dover scorrere gli stessi post a ogni visita? Quando registri un account, tornerai sempre esattamente dove eri rimasto e potrai scegliere di essere avvisato delle nuove risposte (tramite email o notifica push). Potrai anche salvare segnalibri e votare i post per mostrare il tuo apprezzamento agli altri membri della comunità.
Con il tuo contributo, questo post potrebbe essere ancora migliore 💗
Registrati Accedi