2016-11-30 7 views
0

Здесь у меня есть structC - Ошибка при прохождении структуры потоков

struct dotData{ 
    long x; 
    long y; 
}; 

Что я пытаюсь перейти к кратному threads

void *find_z(void *thisdot) 
{ 
    long z; 
    struct dotData *data; 
    *data = *((struct dotData*)(thisdot)); 
    z = data.x + data.y; 
    printf("Here's our dot! %ld * %ld = %ld \n", data.x, data.y, z); 
    pthread_exit(NULL); 
} 

Из main() где я создаю-структуру thisdot, который передается как аргумент find_z при каждом изменении его элементов x и y

int main() 
{ 
. 
. 
. 
    struct dotData thisdot; 

    int NUM_THREADS; 
    NUM_THREADS = N*M; 
    pthread_t threads[NUM_THREADS]; 
    int i, j; 

    for(i = 0; i < M; i++){ 
     for (j = 0; j < N; j++) { 
      thisdot.x = x_dotBegin + x_interval*j; 
      thisdot.y = y_dotBegin + y_interval*i; 
      pthread_create(&threads[NUM_THREADS], NULL, find_z, &thisdot); 
     } 
    } 
    pthread_exit(NULL); 
} 

Однако, во время компиляции я получаю сообщение об ошибке в z = data.x + data.y;

error: request for member ‘x’ in something not a structure or union| 
error: request for member ‘y’ in something not a structure or union| 

Как правильно передать эту структуру для потоков?

+0

'data-> x' и' data-> y', но у вас есть неопределенное поведение с '* data = ...' –

+0

Компилятор точно описывает, в чем проблема. Данные не являются структурой, а не объединением. Данные - это указатель. Обращайте его как указатель. – Gerhardh

ответ

2

Проблема заключается в том, что data является указатель на структуру, так и для тех, вам нужно использовать «стрелка» оператор ->, как в data->x.


Существует хуже проблема, хотя:

struct dotData *data; 
*data = *((struct dotData*)(thisdot)); 

Указатель data не указывает в любом месте. Неинициализированные локальные (нестатические) переменные будут иметь неопределенное значение. Чтобы использовать указатель, вам нужно на самом деле указать его.

Или простое решение, и тот, который я рекомендую, не использовать указатели на все:

struct dotData = *(struct dotData *) thisdot; 

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

Это можно решить путем динамического выделения структуры, которую вы передаете потокам. Затем вы можете скопировать указатель вместо копирования структуры. И вы должны помнить об free данных или у вас будет утечка памяти.

0

data является указателем, поэтому используйте (*data).x или data->x