将const void *数据中的数据转换为double

时间:2014-07-22 07:39:57

标签: c++ c pointers void-pointers

我从其他一些函数收到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类型,我尝试了指向double的指针:

double* dptr;
dptr=&(*data+8);
dptr;

出现错误,如

  

“错误:'const void *'不是指向对象的指针类型”

4 个答案:

答案 0 :(得分:2)

在C中,您无法取消引用void指针。 因此,您可以键入强制转换void指针并使用它。 像这样的东西dptr =((double *)data + 8);因此,无效的数据现在被视为双指针。

答案 1 :(得分:1)

编辑您的帖子非常不清楚。假设data实际上是指向double数组的指针,解决方案甚至更简单:

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 *上执行指针算术和解除引用,因此*datadata + 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上找到的数据的两倍?

// wrong:
double *pd = &i;
cout << *pd << endl;

这是错误的,因为您所做的是转换指针类型而不是实际数据。实际上,您将在地址pi处找到的位模式解释为表示double的位模式。但该位模式代表int

您需要做的是按原样检索数据:int然后将int转换为double

int x = *pi;
double d = (double) x;

答案 2 :(得分:0)

您无法在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类型中,跳转的字节数实际上与您的偏移量相同。

答案 3 :(得分:0)

#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("%f\n", v);//8.000000
    return 0;
}