将数据从const void *data转换为double类型
Convert data from const void *data to double
我从其他函数接收到myfunction(const void *data)
的数据,其中指针data
存储像{0,0,0,0,0,0,0,40,20,0,0,0,0,0,0}
这样的值。
我想访问{40,20,0,0,0,0,0,0}
的值,并转换为double
类型的值,应该给出8.0
。对于访问和转换为双精度类型,我尝试了双精度指针:
double* dptr;
dptr=&(*data+8);
dptr;
给出类似
这样的错误"错误:' const void* '不是指向对象的指针类型"
在C中不能取消对void指针的引用。因此,您可以对void指针进行类型强制转换并使用它。像这样dptr=((double*)data+8);
编辑你的帖子很不清楚。假设data
实际上是一个指向双精度数组的指针,解决方案甚至更简单:
double * pd = static_cast<double const *>(data);
double d0 = pd[0];
double d1 = pd[1];
或(C):
double * pd= (double const *)(data);
double d0 = pd[0];
double d1 = pd[1];
不能在void *
上执行指针运算和解引用,因此*data
或data + 8
无效。
我不明白你到底想做什么,但这里是你如何访问数据在你的数组:
假设存储的数据实际上是int
,要访问第8个元素并将其转换为double,您应该这样写:
double el = static_cast<double>*(static_cast<int const *>(data) + 8));
更好:
int *p = static_cast<int const *>(data);
double el = static_cast<double>(p[8]);
请注意非常重要将data
转换为原始指针类型。在我的例子中,我使用int
,但你应该用你的数据实际是什么来替换它。
在这一点上,如果你显示的{0,0,0,0,0,0,0,40,20,0,0,0,0,0,0}
实际上是字节,那么原始指针类型是char *
,你应该转换为char *
。
进一步说明从指针转换数据:
假设你有一个指向int
的指针:
int i = 24;
int *pi = &i;
如何将地址pi
上的数据转换为double ?
// wrong:
double *pd = &i;
cout << *pd << endl;
这是错误的,因为您所做的是转换指针类型而不是实际数据。实际上,您将地址pi
上的位模式解释为表示double
的位模式。但是那个位模式代表和int
。
您需要做的是检索数据,因为它是:一个int
,然后将int
转换为double
:
int x = *pi;
double d = (double) x;
#include <stdio.h>
#include <string.h>
double myfunction(const void *data){
double v;
memcpy(&v, data, sizeof(v));
return v;
}
int main (int argc, char *argv[]) {
unsigned char data[] = {0x40,0x20,0,0,0,0,0,0};
int i, len = sizeof(data);
//reverse data If necessary
for(i=0;i<len/2;++i){
unsigned char c = data[i];
data[i] = data[len -1 -i];
data[len -1 -i] = c;
}
double v;
v = myfunction(data);
printf("%fn", v);//8.000000
return 0;
}
您不能在void指针中执行指针算术,因为您不知道内部数据的大小(正如它所说的,它是void)。您必须将其类型转换为具有已知大小的类型。
正确的类型转换和指针算术如下(使用旧的C转换):
char * ptr=(char *)data;
double * myDoublePtr=(double *)(ptr+8);
double myDouble=*myDouble;
或者,如果你有两个连续的双:
double * ptr=(double *)data;
double myDouble=*(ptr+1); //This will access the second double.
这是因为指针运算中的偏移量将执行offset*sizeof(type)字节的跳转,因此在char类型中,跳转的字节数实际上与您的偏移量相同。
- C++在数学计算中将double转换为int
- 有没有办法在C++的赋值中将"char**"转换为"double"?
- 错误:无法将"<lambda(double)>"转换为"double(*)(double)"
- 如何正确将"strings"转换为"double"?
- Zedboard zynq-7000 Opencl 浮点数从类型 'double*' 强制转换为类型 'double' 无效
- "std::function<double(double)>"到"double (*)(double)"之间的转换
- C++ 模板函数无法将"std:string"转换为"double"作为回报
- 缩小从double到float的转换
- 在不复制数据的情况下,将double数组转换为只有double成员的structs数组
- 将 mwArray 转换为 std::vector<double>
- 使用词法强制转换在'string to double'中设置双精度变量的精度
- 如何将 Java double[][] 转换为 C++ <vector<vector>> JNI?
- 从 std::vector<double> 到 Python 列表的转换失败(提升 python)
- 转换 cv::mat 转换为 std::矢量<double>并发症
- 将双数组转换为标准::复杂<double>
- 将 std::vector<boost::optional<double>> 转换为 std::vector<double>
- 将 double* 转换为 std::vector<double> (C++)
- 无法将复数<double>转换为双精度
- 将 int 转换为双精度以执行 std::complex <double>的"*"操作
- "double(*)(string, double, double)"尝试传递函数C++时"double"转换错误