2016-11-30 44 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