2016-11-30 42 views
0

在这里,我有一个structÇ - 错误,同时通过结构线程

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每次其元素xy发生变化时

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

'数据 - > x'和'数据 - > y'但是你不确定与'*数据= ...' –

+0

编译器会告诉你问题是什么行为。数据不是一个结构而不是一个联盟。数据是一个指针。像指针一样处理它。 – Gerhardh

回答

2

的问题是,data指针的结构,并为那些需要在data->x使用“箭头”操作符->,等等。


有虽然是糟糕的问题:

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

指针data不指向任何地方。未初始化的本地(非静态)变量将具有不确定的值。要使用指针,实际上需要将它指向某处。

或者,一个简单的解决方案和一个我建议,不要使用指针都:

struct dotData = *(struct dotData *) thisdot; 

你也有另一个大问题,你如何将数据传递到线程。所有的线程都会得到相同结构的指针。所以,你在创建线程的循环进行修改将为所有所有线程设置的数据。

这可以通过动态地分配你传递给线程的结构来解决。然后您可以复制指针而不是复制结构。并且您必须记住free的数据,否则您将发生内存泄漏。

0

data是一个指针,所以使用(*data).xdata->x