2016-11-24 10 views
0

Ich versuche Pthread Beispiel. Hier ist mein Code:Fehler: kann eine Variable vom Typ 'int' mit einem Lvalue vom Typ 'void' nicht initialisieren

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

und ich verwende diesen Code zu kompilieren:

gcc -lpthread ThreadDeneme.cpp 

oder

g++ -lpthread ThreadDeneme.cpp 

und der Fehler sagt:

kann eine Variable nicht initialisieren vom Typ 'int' mit einem Lvalue vom Typ 'void' int b als = * gelen;

Ich benutze diese:

int bas = (int *) gelen;

aber Fehler noch in Bearbeitung.

Ich las:

What is the difference between these uses of pointers?

+0

Bitte bearbeiten Sie Ihren Code und beheben Sie die Einrückung. Entfernen Sie auch das C++ - Tag. Ich werde diese Frage nicht lesen. – Lundin

+1

Im Gegensatz zu @Lundin ist dies: 'i = new int;' ist nicht C. Bitte markiere richtig und mische keine Sprachen. – unwind

+0

@unwind Ebenso ist die allererste Zeile '#include ' nicht C++. – Lundin

Antwort

5

1) Sie sind nicht erlaubt zu dereferenzieren einem void *. Also,

int bas= *gelen; 

wird nicht funktionieren. Der richtige Weg, um die int zu lesen ist:

int bas= *(int*)gelen; 

2) Aber das ist auch nicht zur Arbeit gehen. Weil die gleiche Adresse i an alle 4 Threads übergeben wird und das in data race resultiert. Also, müssen Sie verschiedene Adresse zu jedem Thread übergeben, um Datenrennen zu vermeiden (oder verwenden Sie eine Form von Synchronisation).

3) Ihre Thread-Funktion AsalK1() sollte einen Zeiger zurückgeben (siehe pthread_create() Anforderung für die Thread-Funktion). Sie können einfach einen NULL-Zeiger zurückgeben, da Sie nichts vom Thread zum Haupt-Thread zurückgeben.

4) Ein weiteres mögliches Problem ist, wie Sie kompilieren:

gcc -lpthread ThreadDeneme.cpp 

Die Bibliothek am Ende der Kommandozeilenoption sein sollte. So kompilieren Sie als:

gcc ThreadDeneme.cpp -lpthread 

Einen anderen verwandten Vorschlag: Sie Array anstelle von 4 verschiedenen Thread-ID-Variablen (th1..4) verwenden können. Es würde ermöglichen, eine Schleife zum Erstellen und Verbinden von Threads zu verwenden, und Sie können auch die Anzahl der Threads ändern.

0

das Problem auf die Fehlermeldung im Zusammenhang Adressierung, benötigen Sie einen vollständigen Typ haben, bevor Sie können dereferenzieren, dass. Ändern

int bas= *gelen; 

zu

int bas= *(int *)gelen; 

FWIW ist void ein unvollständiger Typ,

Die void Typ umfasst einen leeren Satz von Werten; Es ist ein unvollständiger Objekttyp, der nicht abgeschlossen werden kann.

Für C++ unter Angabe C++14, (emphasis Mine)

unären * Operator führt Indirektion: Der Ausdruck, auf die sie angewendet wird ein Zeiger auf ein Objekttyp sein, oder ein Zeiger auf einen Funktionstyp und das Ergebnis ist ein lvalue, der sich auf das Objekt oder die Funktion bezieht, auf die der Ausdruck zeigt. Wenn der Typ des Ausdrucks „Zeiger auf T“ ist der Typ des Ergebnisses ist „T“[Anmerkung: Indirektion durch einen Zeiger auf einen unvollständigen Typ (außer cv void) gültig ist, .Der so erhaltene Wert kann in begrenzter Weise verwendet werden (zum Beispiel zum Initialisieren einer Referenz); diese lvalue darf nicht zu einem prvalue umgewandelt]

1

Sie werden

int bas= *(int *) gelen;

Erste cast Zeiger vom Typ dereferenzieren int dann verwenden müssen, verwenden *

0

Sie müssen es in den Zeiger vom Typ int umwandeln. Sie haben auch einen Fehler in printf.

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

Wie Sie sehen in void * AsalK1 (void * gelen) Funktion gelen ist void-Zeiger und Sie müssen in Ihrem Fall gültigen Datentyp typisieren benötigen Sie sind in int bas speichern gehen, da die bas ist int-Datentyp, so dass der Gelen-Zeiger typecase to int * wie unten sein sollte

int bas= *(int *) gelen; 
Verwandte Themen