Pergunta

Eu tenho uma função C recebendo um uint8 ponteiro com outro parâmetro que é o seu tamanho (número de bytes).

eu quero extrair double dados deste buffer.Aqui está o meu 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");
    }
}

O problema é que não estou recebendo o que estou enviando dentro de um hardware externo.Acho que meu elenco está errado.Tentei outros métodos, mas sem nenhum bom resultado.Ainda não consigo receber o que envio.

Foi útil?

Solução

Se entendi sua pergunta (não está totalmente claro se há no máximo um double para extrair ou pode haver muitos), eis o que eu tentaria fazer:

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

O que isso evita é um possível problema de alinhamento em um elenco como d = *(double*)data.

Isto pode falhar de maneiras estranhas e feias se os dados não representarem um valor válido. double, especificamente se for invertido (por exemploseu hardware é little-endian e a CPU que executa esse código é big-endian ou vice-versa).

Ainda não sei se problemas de alias se aplicam.Precisa ler o padrão novamente.Nunca os vi na prática, no entanto.

Outras dicas

Supondo que seus dados sejam na verdade uma matriz de duplos e o tamanho seja o número de bytes, seu código deve ser parecido com isto:

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

Muito provavelmente, o tamanho é o número de bytes e não o número de duplos, então você terá que dividir o tamanho pelo tamanho de um duplo para obter o número real de duplos:

Se você fizer isto:

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

então você está dizendo que o ponteiro para o ponteiro para os dados é um ponteiro duplo.

Além disso, sua declaração printf foi assim:

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

Você estava dizendo para imprimir um int (%d é um int) e não deu um valor real para imprimir.Mudei para% g, que imprime um duplo no formato de melhor 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);
  }

 }

é o que eu acho que você está procurando, o ponteiro é na verdade um ponteiro para uma matriz de duplos, então você apenas o lança exatamente para isso

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top