我有一个 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, ,特别是如果它被颠倒了(例如您的硬件是小端字节序,而运行此代码的 CPU 是大端字节序,或者反之亦然)。

我还不知道是否存在别名问题。需要再读一遍标准。但从未在实践中见过它们。

其他提示

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

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,它以最适合的格式打印双精度值。

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