2016-11-30 2 views
0
スレッドに

を構造を通過する間に、私は私が私が渡された構造体thisdotを作成main()からthreadsC - エラーここ

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); 
} 

倍数に渡すしようstruct

struct dotData{ 
    long x; 
    long y; 
}; 

を持っていますxyが変更されるたびにfind_zへの引数として返されます。

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ポインタが。初期化されていないローカル(非静的)変数の変数は、で、不確定変数です。ポインタを使用するには、実際にどこかを指すようにする必要があります。

あるいは、簡単な解決策と私はお勧め1のために、まったくのポインタを使用しない:

struct dotData = *(struct dotData *) thisdot; 

あなたはまた、別の大きな問題を持っているあなたは、スレッドにデータを渡す方法で。すべてのスレッドは同じ構造体に同じポインタを取得します。したがって、スレッド作成ループで行った変更は、すべてのデータすべてのスレッドに設定されます。

これはスレッドに渡す構造体を動的に割り当てることで解決できます。構造体をコピーするのではなく、ポインタをコピーするだけです。そして、あなたはデータをfreeに覚えていなければなりません。そうしないと、メモリリークが発生します。

0

dataはポインタなので、(*data).xまたはdata->x