2015-04-30 286 views
1

这里是我的问题: 我有一个结构:指针和结构指针

typedef struct Data_Package{ 
    int type; 
    size_t size; 
    void* data; 
}Data_Package; 

,我有一个功能:(编辑:阿门Tsirunyan评论)(这是一个.C功能)

void myFunc(Data_Package* ioData) { 
    ioData->data = malloc(sizeof(double)); 
    (ioData->data)= (double*)62.5 
} //that doesn't work 

和main.cpp中,我想用我的功能:

Data_Package* ioData=0; 
/* some random operation that change the data,type,... */ 
myFunc(ioData); 

stc::cout << *static_cast<double*>(ioData->data) << std::endl //I want to display te value data (and not the address) 

所以我想如T o知道如何更改我的函数中的数值数据,然后将其显示在main.cpp中(我需要使用指针和数据为void *,因为它可能是double或bool或int或...)

谢谢很多。

Drlk。

+0

看起来像使用构造函数和'boost:variant'会更好。 – TartanLlama

+0

我想我可以尝试一下,但它是否与定义类型一样精确?例如我从另一个文件中收到一个double。如果我将它转换成变体,我会丢失数据和精度? – drlk

+0

现在有什么问题?我看到你已经改变了你的问题(并且使答案无效)。您不应该以这种方式编辑您的问题(不要更改它的内容,只需在编辑部分添加更多信息)。那么,哪些不起作用?您想做什么? – zoska

回答

1

1)

ioData->data 

void*类型。您无法取消引用无效指针。你应该首先将其转换为相应的指针类型,在你的情况下,双

cout << *static_cast<double*>(ioData->data) 

2)

*(ioData->data) = 65.5; 

您的指针不指向任何有效呢,你不能取消对它的引用。你可能想要做的是

ioData->data = new double; 
*static_cast<double*>(ioData->data) = 65.5 

3)

正如你所看到的,应对void*是丑陋的。你有没有而不是直接在你的结构中存储double的具体原因?

+0

Humm I will tr​​y the cast but I我不想在我的函数中创建ioData,我假定ioData存在于主函数中,所以我不必在函数中创建“ioData-> data = new double”,我将尝试执行演变并声明在main.cpp中的对象和我回来 – drlk

+0

我不能使用double,因为数据可以是任何类型(double或int或bool或其他) – drlk

+0

我试过了,但函数不能编译... = / – drlk