Estrai i dati da UINT8 per raddoppiare
-
12-12-2019 - |
Domanda
Ho una funzione C che riceve un puntatore uint8
con un altro parametro che è la sua dimensione (numero di byte).
Voglio estrarre i dati double
da questo buffer.Ecco il mio codice:
Write(uint8* data, uint8 size) /* data and size are given by a callback to my function)*/
{
double d;
for (i = 0; i < size; i++)
{
d = ((double*)&data)[i];
printf(" d = %d\n");
}
}
.
Il problema è che non ricevo ciò che sto inviando all'interno di un hardware esterno.Immagino che il mio cast sia sbagliato.Ho provato altri metodi ma senza alcun buon risultato.Non sono ancora in grado di ottenere ciò che mando.
Soluzione
Se capisco la tua domanda (non è completamente chiaro se c'è al massimo un double
per estrarre o ci possono essere molti), ecco cosa avrei provato a fare:
double Write(uint8* data, uint8 size)
{
double d;
if (size < sizeof(d))
return 0; // failure; you may want something smarter than this
memcpy(&d, data, sizeof(d));
return d;
}
.
Ciò che evita è un potenziale problema di allineamento in un cast come d = *(double*)data
.
Ciò potrebbe fallire in modi dispari e brutti se i dati non rappresentano un double
di generazione valido, in particolare se è invertito (ad es. L'hardware è Little-Endian e la CPU che esegue questo codice è Big-Endian o in altro modo).
Non lo so ancora se si applicano problemi di aliasing.Hai bisogno di leggere di nuovo lo standard.Non li ho mai visti in pratica, però.
Altri suggerimenti
Supponendo che i tuoi dati siano in realtà una serie di doppi e dimensioni è il numero di byte, il tuo codice dovrebbe apparire qualcosa del genere:
Write(uint8* data, uint8 size) /* data and size are given by a callback to my function)*/
{
double d;
int i;
for (i=0; i<size/sizeof(double); ++i) {
d = ((double*)data)[i];
printf(" d = %g\n",d);
}
}
.
Molto probabilmente, la dimensione è il numero di byte e non il numero di doppi, quindi devi dividere le dimensioni dalla dimensione di un doppio per ottenere il numero effettivo di doppio:
Se lo fai:
d = ((double*)&data)[i];
.
Quindi stai dicendo che il puntatore al puntatore ai dati è un doppio puntatore.
Inoltre, la tua dichiarazione Printf è stata così:
printf(" d = %d\n");
.
Stavi dicendolo di stampare un INT (% D è un INT) e non dargli un valore effettivo da stampare.Ho cambiato questo in% G, che stampa un doppio in formato Best-Fit.
Write(uint8* data, uint8 size) /* data and size are given by a callback to my function)*/
{
double d;
for (i=0; i<size; i++) {
d = ((double*)data)[i];
printf(" d = %d\n", d);
}
}
.
è ciò che sto indovinando che stai cercando, il puntatore è in realtà un puntatore a una serie di doppi in modo da averlo appena gettato esattamente a quella