2015-04-30 344 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