我有一个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");
}
}
问题是我没有收到我在外部硬件中发送的内容。我想我的演员是错的。我尝试了其他方法,但没有任何好结果。我仍然无法得到我发送的东西。
答案 0 :(得分:2)
假设您的数据实际上是一个双精度数组,而size是字节数,那么您的代码应如下所示:
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是字节数而不是double的数量,所以你必须将size除以double的大小才能得到实际的double数:
如果你这样做:
d = ((double*)&data)[i];
然后你说指向数据的指针是一个双指针。
另外,你的printf语句是这样的:
printf(" d = %d\n");
你告诉它要打印一个int(%d是一个int),而不给它一个实际打印值。我将其更改为%g,以最合适的格式打印双倍。
答案 1 :(得分: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);
}
}
是我猜你正在寻找的东西,指针实际上是一个指向双数组的指针,所以你只是把它投射到那个
答案 2 :(得分: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是big-endian或其他方式)。
我还不知道是否适用别名问题。需要再次阅读标准。但是,在实践中从未见过它们。