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.

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top