2013-06-17 13 views
6

Ich versuche pthread_create() zu verwenden, aber es gibt mir immer diesen Fehler ungültige Umwandlung von void* zu void* (*)(void*)ungültige Konvertierung von 'void *' in 'void * (*) (void *)' C++?

Dieser Fehler im 3. Argumente. Könnte mir jemand mit diesem Fehler helfen?

void Print_data(void *ptr) { 
    cout<<"Time of Week = " <<std::dec<<iTOW<<" seconds"<<endl; 
    cout<<"Longitude = "<<lon<<" degree"<<endl; 
    cout<<"Latitude = "<<lat<<" degree"<<endl; 
    cout<<"Height Above Sea = "<<alt_MSL<<" meters"<<endl;  
    } 

int call_thread() 
    { 
    pthread_create(&thread, NULL, (void *) &Print_data, NULL); 
    return 0; 
    } 
+1

warum Sie '(void Gießen sind machen *) 'an erster Stelle? –

+0

Klingt so, als müsste der Cast nicht void * sein, weil er erwartet, dass ein Zeiger funktioniert und trotzdem void zurückgibt? – Utopia

+0

Der Titel sagt 'void * (*) (void *)' aber die Beschreibung sagt 'void *() (void)' - welche ist die richtige Fehlermeldung? Bitte klären Sie, weil ich gerade eine Bearbeitung abgelehnt habe, die erraten hat. – Philipp

Antwort

2

müssen Sie void* zurückkehren

void* Print_data(void *ptr) { 

die Bedürfnisse zu befriedigen.

Die Signatur der Funktion übergeben werden

void* function(void*); 

dann rufen pthread_create mit

pthread_create(&thread, NULL, &Print_data, NULL); 
16

Der Fehler wird, dass Sie den Funktionszeiger (void* (*)(void*)) auf einen Objektzeiger konvertieren (void*), wenn pthread_create einen Funktionszeiger für dieses Argument erwartet. Es gibt keine implizite Konvertierung zum Rückgängigmachen der fehlerhaften Konvertierung, die Sie vorgenommen haben, daher der Fehler.

Die Antwort ist nicht, das zu tun:

pthread_create(&thread, NULL, &Print_data, NULL); 

und Sie müssen auch Print_data ändern void* zurückzukehren, um die Posix-Threads Schnittstelle zum Spiel:

void *Print_data(void *ptr) { 
    // print stuff 
    return NULL; // or some other return value if appropriate 
} 

Wie in den Kommentaren darauf hingewiesen, , gibt es verschiedene andere Probleme mit der Verwendung dieser C-Bibliothek direkt aus C++; Im Hinblick auf die Portabilität sollte die Thread-Eingabefunktion insbesondere extern "C" sein. Persönlich würde ich empfehlen, die Standard-C++ - Thread-Bibliothek zu verwenden (oder die Boost-Implementierung, wenn Sie mit einer Version der Sprache vor 2011 festgefahren sind).

+0

Das wird auch nicht kompiliert (oder at mindestens nicht sauber), da 'pthread_create' eine Funktion erwartet, die einen 'void *' - Wert zurückgibt, und die Funktion 'Print_data' als' void Print_data' deklariert ist - relativ einfach zu beheben, indem '' 'nach' void' hinzugefügt wird und 'zurück NULL;' am Ende der Funktion. –

+1

@MatsPetersson: Daher die letzte Zeile meiner Antwort. Ich habe etwas mehr Klarheit hinzugefügt, falls andere das nicht bemerken. –

+0

Ich habe genau das getan, was du gesagt hast, jetzt gab es mir einen weiteren Fehler, der undefinierten Verweis auf Pthread bedeutet ?? – Zeyad

4

Sie versuchen, einen Funktionszeiger in eine hier void* zu konvertieren: (void *) &Print_data

Nach pthread_create Sie in einer Funktion übergeben müssen, die eine void* und gibt eine Signatur void*

So Ihre Funktion übernimmt sollte sein

void* Print_data(void *ptr) 

Und sollte Ihr Anruf sein

pthread_create(&thread, NULL, &Print_data, NULL); 
2

pthread_create das dritte Argument als

int pthread_create(pthread_t *thread, 
        const pthread_attr_t *attr, 
        void *(*start_routine)(void*), 
        void *arg); 

Dies geschieht, ist void *(*start_routine)(void*) ein Zeiger auf eine Funktion, die einen void* Zeiger und gibt einen Zeiger void* nimmt.

Wenn Sie &Print_data und wandeln den Zeiger auf void * tun, es bedeutet, dass Sie void* und keinen Zeiger vom Typ void *(*start_routine)(void*) [Funktionszeigern] einen Zeiger des Typs sind vorbei.

Um richtig, müssen Sie Ihre Rückgabetyp als void* und machen den Anruf als pthread_create(&thread, NULL, &Print_data, NULL);

0

Add-Header-Datei # include und kompilieren g ++ -lpthread

+0

Header-Datei hinzufügen #include und kompilieren g ++ -lpthread –

+0

Dies sollte nur ein Kommentar sein. Keine vollständige Antwort – Raju

Verwandte Themen