2016-03-25 10 views
0

編集:これはJohn Bollingerとalkの助けを借りて答えられました。下記のコメントをお読みください!私はまた、私の改訂コードを読んでいる人のためのこのオリジナルポストの下部に含めましたpthread_createの関数ポインタ配列の使用 - 初期化に近い

私はpthread_createで関数の引数として送信するために配列の配列を使用しようとしていますが、コンパイルしようとするとき(使用した: "gccの-std = c99をP1.c -lpthread" 私は次のエラーになっています:

P1.c:40:1:警告:互換性のないポインタ型からの初期設定を[デフォルトで有効]

func_ptr funcs [4] = {func0、func1、func2、func3};

P1.c:40:1:警告: S [0] ')

P1.c [デフォルトで有効]:40:1:警告:40:1:警告:[デフォルトで有効になっ】互換性のないポインタ型

P1.cから初期化( 40:1:警告:近初期化 'のfuncs [1]')

P1.c [デフォルトで有効になって】互換性のないポインタ型からの初期化[デフォルトで有効]

P1.c:40:1 :警告:( 'funcs [2]'の初期化に近い)[デフォルトで有効]

P1.c:40:1:警告:初期化私はそれが問題だと思う( 'のfuncs [3]' の初期の近く)

[デフォルトで有効に]:40:1:警告互換性のないポインタ型から上

P1.c [デフォルトで有効になります]私の関数ポインタのtypedef宣言では、問題の内容を正確に把握することができません。以下は、関連するコードスニペットです:

void func0() 
{ printf("A"); } 

void func1() 
{ printf("B"); } 

void func2() 
{ printf("C"); } 

void func3() 
{ printf("D"); } 

typedef void* (*func_ptr)(void *); 
func_ptr funcs[4] = {func0, func1, func2, func3}; 

int main(int argc, char *argv[]) 
{ 
    pthread_t pth[THREADCNT]; 

    for(int i =0; i < THREADCNT; i++) 
      pthread_create(&pth[i], NULL, (funcs[i])(), NULL); 

    for(int i =0; i < THREADCNT; i++) 
      pthread_join(pth[i], NULL); 
} 

改訂WORKING CODE

// changed these functions to void* with (void * pv) parameter to 
// match the typedef (and also match the pthread_create parameter) 
void* func0(void * pv) 
{ printf("A"); } 

void* func1(void * pv) 
{ printf("B"); } 

void* func2(void * pv) 
{ printf("C"); } 

void* func3(void * pv) 
{ printf("D"); } 

typedef void* (*func_ptr)(void *); 
func_ptr funcs[4] = {func0, func1, func2, func3}; 

int main(int argc, char *argv[]) 
{ 
    pthread_t pth[THREADCNT]; 

    for(int i =0; i < THREADCNT; i++) 
      pthread_create(&pth[i], NULL, funcs[i], NULL); 
// changed the funcs[i] because the function isn't called, the value is just passed as an argument 

    for(int i =0; i < THREADCNT; i++) 
      pthread_join(pth[i], NULL); 

} 
+1

うん...'void func0()'は 'void *(* func_ptr)(void *);'のように見えます。あなたへ? –

+0

また、これは何ですか: '(funcs [i])()' - あなたはそれを呼び出しています。 –

答えて

2

BELOW変更

void func0() 

void * func0(void * pv) 
012であることを (他の3つは同じ)

これは、配列が保持すると定義されている型であり、タイプがpthread_create()であるためです。


変更

pthread_create(&pth[i], NULL, (funcs[i])(), NULL); 

あなたがfuncs[i]を呼ぶが、その値を渡したくないよう

pthread_create(&pth[i], NULL, funcs[i], NULL); 

されるように。

+0

2番目の部分をクリアしていただきありがとうございます。関数のポインタが丸括弧で呼び出されたと私が思ったすべての検索。構文エラーです。あなたの答え+ジョン・ボリンジャーは物事をクリアするのを助け、今それは働いています。ヘルプありがとう – MLDimitry

+0

関数ポインタは呼び出されませんが、値は** passed **です。 @ MarkD94 – alk