2016-11-09 6 views
-1

Cでマルチスレッドを利用するために構造体を関数に渡そうとしていますが、どういう仕組みか分かりません。さまざまなエラーメッセージを出すさまざまな構文を試したので、私の特定のクエリが以前に答えられたかどうかはわかりません。私は、私がやりたいことに似せることができる最もシンプルなコードをまとめました。たとえ人のために働いているようなこのサイトの同様の例と一致するように設定しても、それでも私にエラーが表示されます。私はちょうど非常に単純なものを見逃していると思っています。構造体をvoid *ポインタとして渡すときに初期化子が無効になる

#include <pthread.h> 
#include <stdio.h> 

typedef struct { 
    int i_start; 
    int i_end; 
} my_struct; 

void *func(void *ptr) { 

    int j_start; 
    int j_end; 

    my_struct input = (my_struct *) ptr; 
    j_start = input.i_start; 
    j_end = input.i_end; 
    printf("%d %d\n", j_start, j_end); 

} 

int main() { 
    my_struct qwerty; 

    qwerty.i_start = 0; 
    qwerty.i_end = 1; 

    pthread_t tid; 

    pthread_create(&tid, NULL, func, &qwerty); 

    return 0; 
} 

をこの特定のコードは私にコンパイルエラーを与える:

test.c: In function 'func': 
test.c:14:20: error: invalid initializer 
    my_struct input = (my_struct *) ptr; 

私は、私はいくつかの異なるものを試してみたが、私はできない、言ったようにとにかく、ここでコンパイルされませんコードです正しく理解する。助けてくれてありがとう。

+1

'my_struct input =(my_struct *)ptr;' - > 'my_struct input = *(my_struct *)ptr;'また、 'func'は値を返す必要があります。 – BLUEPIXY

+0

実験的にCを学習すると、あなたが得たくない場所に移動します。 –

+0

さらに、別の問題に直面することがあります.funcスレッドが開始または完了する前にメインスレッドが終了することがあります。これをどう対処するかを見てください(http://stackoverflow.com/a/40514326/1275169)。 –

答えて

2

my_struct input = (my_struct *) ptr;

inputのタイプはmy_structで、あなたはそれにmy_struct *値(my_structへのポインタ)を割り当てるしようとしています。タイプは一致する必要があります。

は(プレーンmy_struct値を取得するために)ポインタ型を使用して、それを逆参照してみてください。

my_struct *input = (my_struct *) ptr; 
j_start = (*input).i_start; 
j_end = (*input).i_end; 

または矢印演算子をポインタ自体を使用して:

my_struct *input = (my_struct *) ptr; 
j_start = input->i_start; 
j_end = input->i_end; 

それとも、逆参照する前にすることができます課題:

my_struct input = *((my_struct *) ptr); 
j_start = input.i_start; 
j_end = input.i_end; 

この構文は混乱する可能性がありますので、su *演算子がどのように動作し、どのように変数型で使用されている*と異なるのかを調べる必要があります。

関連する問題