2015-04-30 2 views
1

Вот моя проблема: У меня есть структура:указатель и структура с указателями

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

и у меня есть функция: (Edit: Армен 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) 

Так что я хотел бы т o знать, как изменить данные значения в моей функции, а затем отобразить их в main.cpp (мне нужно использовать указатель, а данные недействительны *, потому что это может быть double или bool или int или ...)

Thanks много.

Drlk.

+0

Похоже, вам будет лучше использовать конструкторы и 'boost: variant'. – TartanLlama

+0

Я думаю, что могу попробовать, но насколько он точен, как определенный тип? например, я получаю двойной файл из другого файла. Если я преобразую его в вариант, я потеряю данные и точность? – drlk

+0

В чем проблема сейчас? Я вижу, вы изменили свой вопрос (и признали недействительным ответ). Вы не должны редактировать свои вопросы таким образом (не изменяйте его содержимое, просто добавьте дополнительную информацию в раздел EDIT). Итак, что не работает? Что ты хочешь делать? – 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 wil try the cast, но я не хочу создавать ioData в моей функции.Я предполагаю, что ioData существуют в основном.Таким образом, мне не придется делать «ioData-> data = новый двойной» в моей функции? Я попробую приведение и объявить объект в main.cpp, и я возвращаюсь – drlk

+0

Я не могу использовать double, потому что данные могут быть любого типа (double или int или bool или что-то еще) – drlk

+0

Я пробовал, но функция не компилируется ... = / – drlk

Смежные вопросы