Вопрос

У меня есть функция C, получающая uint8 указатель с другим параметром — его размером (количество байтов).

Я хочу извлечь double данные из этого буфера.Вот мой код:

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

Проблема в том, что я не получаю то, что отправляю, на внешнем оборудовании.Я думаю, что мой актерский состав неправильный.Я пробовал другие методы, но без какого-либо хорошего результата.Я до сих пор не могу получить то, что отправляю.

Это было полезно?

Решение

Если я понимаю ваш вопрос (не совсем понятно, есть ли хотя бы один double извлечь или их может быть много), вот что я бы попробовал сделать:

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

Чего это позволяет избежать, так это потенциальной проблемы с выравниванием в таком приведении, как d = *(double*)data.

Это может потерпеть неудачу странным и уродливым образом, если данные не представляют собой действительные данные. double, особенно если оно перевернуто (например.ваше оборудование имеет прямой порядок байтов, а процессор, на котором выполняется этот код, имеет обратный порядок байтов или наоборот).

Я еще не знаю, применимы ли проблемы с псевдонимами.Нужно еще раз прочитать стандарт.Хотя на практике их не видел.

Другие советы

Предполагая, что ваши данные на самом деле представляют собой массив чисел типа double, а размер — это количество байтов, ваш код должен выглядеть примерно так:

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

Скорее всего, размер — это количество байтов, а не количество двойных значений, поэтому вам придется разделить размер на размер двойного значения, чтобы получить фактическое количество двойных значений:

Если вы сделаете это:

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

тогда вы говорите, что указатель на указатель на данные является двойным указателем.

Кроме того, ваш оператор printf был таким:

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

Вы сказали ему напечатать целое число (%d — это целое число), но не указали фактическое значение для печати.Я изменил его на %g, который печатает двойное значение в наиболее подходящем формате.

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

 }

это то, что, я думаю, вы ищете, указатель на самом деле является указателем на массив двойных значений, поэтому вы просто приводите его именно к этому

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top