2014-12-15 3 views
3

Так что я пытаюсь передать несколько значений в поток с помощью struct.C++: передать структуру в PThread

Это то, что у меня есть:

int main() 
{ 

struct Data 
{ 
int test_data; 
int test_again; 
}; 

Data data_struct; 
data_struct.test_data = 0; 
data_struct.test_again = 1; 

pthread_create(&thread, NULL, Process_Data, (void *)&data_struct); 
return 0; 
} 


void* Process_Data(void *data_struct) 
{ 
struct test 
{ 
    int test_variable; 
    int test_two; 
}; 
test testing; 
testing.test_variable = *((int *)data_struct.test_data); 
testing.test_two = *((int *)data_struct.test_again); 
} 

Я оставил любой код (inluding #include с и thrad присоединяется и т.д.) Я думаю, что не является необходимым для этого вопроса для простоты, однако, если больше кода необходимо пожалуйста, просто спросите.

Поток работал нормально при передаче только одной целочисленной переменной.

Это ошибка я получаю:

В функции 'пустота * process_data (недействительный *): ошибка: запрос члена „test_variable“ в „data_struct“, который имеет типа неклассовой Пустоты * 'testing.test_variable = * ((int *) data_test.test_variable);

И то же самое для других переменных

Заранее спасибо за любые советы.

+0

Ну, стыки сделать некоторые различия. Без них, что сохраняет структуру живым? –

+0

Является ли ['std :: thread'] (http://en.cppreference.com/w/cpp/thread/thread) не вариантом для вас? –

ответ

4

Обычного способ

void* Process_Data(void *data_struct) 
{ 
    Data *testing = static_cast<Data*>(data_struct); 

    // testing->test_data and testing->test_again are 
    // data_struct.test_data and data_struct.test_again from main 
} 

Вы получаете ошибку вы получаете, потому что вы пытаетесь выбрать пользователь из void указателя, который не имеет никакого. Чтобы использовать структуру, которую вы знаете, указывает указатель void, вы должны вернуть ее к указателю на эту структуру.

Также обратите внимание, что вы должны pthread_join нить, которую вы только что начали, или основной конец, прежде чем он сможет что-либо сделать.

+0

Благодаря @Wintermute проблема в том, что 'Data' не объявлен в области потока, должен ли я каким-то образом передавать фактическую структуру вместо экземпляра ее (т. Е. Передать' Data' вместо 'data_struct')? – user3001499

+0

Сама структура не является объектом (это тип объекта), поэтому вы не можете передать ее функции. Я бы объявлял структуру за пределами main, поэтому обе функции знают ее. В заголовке, если функции находятся в разных единицах перевода. – Wintermute

+0

хорошо, отлично работает – user3001499

1

Вы нетипизированная пустота * указатель, с которого вы пытаетесь извлечь данные

Попробуйте сначала бросить указатель на что-то, а затем использовать его

Data* p = (Data*)data_struct; 

int a = p->test_data; 
int b = p->test_again; 
+0

C-style casts are bad mmkay. –

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