Pregunta

Tengo una función C que recibe un uint8 puntero con otro parámetro que es su tamaño (número de bytes).

quiero extraer double datos de este buffer.Aquí está mi código:

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");
    }
}

El problema es que no recibo lo que envío dentro de un hardware externo.Supongo que mi yeso está mal.Probé otros métodos pero sin ningún buen resultado.Todavía no puedo recibir lo que envío.

¿Fue útil?

Solución

Si entiendo tu pregunta (no está del todo claro si hay como máximo una double extraer o pueden haber muchos), esto es lo que intentaría hacer:

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;
}

Lo que esto evita es un posible problema de alineación en un yeso como d = *(double*)data.

Esto puede fallar de maneras extrañas y desagradables si los datos no representan una double, específicamente si está al revés (p. ej.su hardware es little-endian y la CPU que ejecuta este código es big-endian o al revés).

Todavía no sé si se aplican problemas de alias.Necesito leer el estándar nuevamente.Aunque nunca los vi en la práctica.

Otros consejos

Suponiendo que sus datos es en realidad una matriz de dobles y el tamaño es el número de bytes, su código debe verse como esto:

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);
  }
}

más probable, el tamaño es el número de bytes y no el número de dobles, por lo que debe dividir el tamaño por el tamaño de un doble para obtener el número real de dobles:

Si haces esto:

    d = ((double*)&data)[i];

Luego, está diciendo que el puntero al puntero a los datos es un puntero doble.

Además, su declaración de impresión fue así:

printf(" d = %d\n");

Le está diciendo que imprima un INT (% D es un INT), y no le dará un valor real para imprimir.Cambié eso a% G, que imprime un doble en formato de mejor ajuste.

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);
  }

 }

es lo que estoy adivinando que está buscando, el puntero es en realidad un puntero a una matriz de dobles para que la acabe de lanzar exactamente

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top