0

我有一个 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");
    }
}

问题是我没有收到我在外部硬件中发送的内容。我想我的演员阵容是错误的。我尝试了其他方法,但没有任何好的结果。我仍然无法收到我发送的内容。

4

3 回答 3

2

假设您的数据实际上是一个双精度数组,大小是字节数,您的代码应该如下所示:

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

最有可能的是,size 是字节数而不是双精度数,因此您必须将 size 除以双精度数才能得到实际双精度数:

如果你这样做:

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

那么您是说指向数据指针的指针是双指针。

此外,您的 printf 语句是这样的:

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

您告诉它打印一个 int(%d 是一个 int),而不是给它一个实际的打印值。我将其更改为 %g,它以最适合的格式打印双精度。

于 2012-10-02T15:19:26.727 回答
1
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);
  }

 }

是我猜你在找什么,指针实际上是一个指向双精度数组的指针,所以你只需将它转换为

于 2012-10-02T15:24:39.407 回答
0

如果我理解您的问题(尚不清楚是否最多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,特别是如果它被反转(例如,您的硬件是小端并且运行此代码的 CPU 是大端或其他方式)。

我还不知道混叠问题是否适用。需要重新阅读标准。不过,在实践中从未见过它们。

于 2012-10-02T15:32:12.850 回答