2016-11-24 9 views
0

私はpthreadの例を試しています。ここに私のコードです:エラー:タイプ 'int'の変数を型 'void'の左辺値で初期化できません

#include<stdio.h> 
#include<stdlib.h> 
#include<pthread.h> 
void*AsalK1(void *gelen); 
int main(){ 

int *i; 
i= new int; 
*i=1; 

int sonSayi; 
pthread_t th1, th2, th3, th4; 
printf("---------------------------------------------\n"); 
printf("|  Threadler ile Asal Sayi Bulma  |\n"); 
printf("---------------------------------------------\n"); 
printf("Son sayi degeri: 1000000 \n"); 

int r1=pthread_create(&th1, NULL, AsalK1, (void *)i); 
    *i=3; 
int r2=pthread_create(&th2, NULL, AsalK1, (void *)i); 
    *i=5; 
int r3=pthread_create(&th3, NULL, AsalK1, (void *)i); 
    *i=7; 
int r4=pthread_create(&th4, NULL, AsalK1, (void *)i); 

pthread_join(th1, NULL); 
pthread_join(th2, NULL); 
pthread_join(th3, NULL); 
pthread_join(th4, NULL); 
    return 0; 
} 
void *AsalK1(void *gelen){ 
int bas= *gelen; 
    printf("bas :&d\n",bas);  
} 

と私はコンパイルするために、このコードを使用します。

gcc -lpthread ThreadDeneme.cpp 

または

g++ -lpthread ThreadDeneme.cpp 

とエラーが言う:

は、変数を初期化することはできません型 'int'の左辺値が の場合 'void' int b as = * gelen;私はこの使用

int型BAS =(int型*)gelenを。

しかし、まだ進行中です。

私が読んで:エラーメッセージに関連する問題に対処する

What is the difference between these uses of pointers?

+0

コードを編集してインデントを修正してください。また、C++タグを削除します。私はこの質問を読まない。 – Lundin

+1

@Lundinとは対照的に、 'i = new int;'はCではありません。正しくタグ付けし、言語を混ぜてはいけません。 – unwind

+0

@unwind同様に、最初の '#include 'はC++ではありません。 – Lundin

答えて

5

1)void *を参照解除することはできません。したがって、

int bas= *gelen; 

は動作しません。 intを読むための正しい方法は次のとおりです。

int bas= *(int*)gelen; 

2)しかし、これはどちらかの仕事に行くのではありません。同じアドレスiがすべての4つのスレッドに渡され、結果はdata raceになります。したがって、データ競合を避けるために(または同期の形式を使用して)、異なるアドレスを各スレッドに渡す必要があります。

3)あなたのスレッド関数AsalK1()はポインタを返すべきです(スレッド関数のpthread_create()の要件を参照してください)。 スレッドからメインスレッドに何も返さないので、単にNULLポインタを返すことができます。

4)別の潜在的な問題は、あなたがコンパイルする方法です:

gcc -lpthread ThreadDeneme.cpp 

ライブラリは、コマンドラインオプションの終わりにする必要があります。

gcc ThreadDeneme.cpp -lpthread 

別の関連の提案:だから、あなたは次のようにコンパイルしますが、代わりに4つの異なるスレッドID変数(th1..4)を使用しての配列を使用することができます。スレッドの作成と結合にループを使用することができ、スレッドの数も簡単に変更できます。

0

を、あなたはその逆参照する前に、完全な型を持っている必要があります。 FWIW、voidvoidタイプ値の空のセットを含む、

不完全型である

int bas= *(int *)gelen; 

int bas= *gelen; 

を変更します。 が完了できない不完全オブジェクトタイプです。それが適用される式は オブジェクトタイプへのポインタ、またはAでなければならない:C++14を引用C++、(強調鉱山

単項*オペレータはインダイレクションを行うため

関数型へのポインタ。結果は、式が指すオブジェクトまたは関数 を参照する左辺値です。式の型は、「Tへのポインタ、」結果の型は 「T.」である場合[注:不完全型(CV void以外)へのポインタを介して間接に有効です。このようにして得られた左辺 は、限定された方法で(例えば、参照を初期化するために)使用することができる。この左辺値は は使用して、

1

は、あなたがそれを間接参照し、その後タイプintのポインタへ

int bas= *(int *) gelen;

まずキャストを使用する必要があります]、prvalueに変換してはいけません*

0

これをint型のポインタにキャストする必要があります。 printfにもエラーがあります。

void *AsalK1(void *gelen){ 
int *bas= (int *) gelen; 
    printf("bas :%d\n",*bas);  
} 
1
int bas= *gelen; 

あなたがvoid * AsalK1(ボイド*のgelen)で見たよう機能gelenは無効ポインタ であり、あなたが があるためint型のBASに格納しようとしているあなたの場合のように、あなたは、有効なデータ型に型キャストする必要がなければなりませんbasはintデータ型ですので、gelenポインタは以下のようにint *にtypecaseする必要があります

int bas= *(int *) gelen; 
関連する問題