2013-06-17 25 views
6

Próbuję użyć pthread_create(), ale to zawsze daje mi ten błąd nieprawidłowy konwersji z void* do void* (*)(void*)nieprawidłowa konwersja z "void *" na "void * (*) (void *)" C++?

Ten błąd jest w 3. argument. Czy ktoś mógłby mi pomóc z tym błędem?

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

czemu odlewania do '(void *) 'na pierwszym miejscu? –

+0

Brzmi tak, jakbyś nie potrzebował obsady, aby unieważnić *, ponieważ spodziewa się, że wskaźnik będzie działał jako powracająca próżnia? – Utopia

+0

Tytuł mówi "void * (*) (void *)", ale w opisie jest napisane "void *() (void)' - który z nich jest poprawnym komunikatem o błędzie? Proszę wyjaśnić, ponieważ właśnie odrzuciłem edycję, która zgadła. – Philipp

Odpowiedz

2

Musisz wrócić void*

void* Print_data(void *ptr) { 

do zaspokojenia potrzeb.

Podpis funkcji mają być przekazywane jest

void* function(void*); 

następnie wywołać pthread_create użyciu

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

błąd jest, że jesteś przekształcenie wskaźnik funkcji (void* (*)(void*)) do wskaźnika obiektu (void*), gdy pthread_create oczekuje wskaźnika funkcji dla tego argumentu. Nie ma żadnej niejawnej konwersji, by cofnąć podejrzaną konwersję, dlatego popełniłeś błąd.

Odpowiedź jest nie robić:

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

i będziesz też musiał zmodyfikować Print_data wrócić void* dopasować gwinty interfejsu POSIX:

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

Jak zauważył w komentarzach , istnieją różne inne problemy z używaniem tej biblioteki C bezpośrednio z C++; w szczególności dla możliwości przenoszenia funkcja wprowadzania wątku powinna być extern "C". Osobiście polecam używanie standardowej biblioteki wątków C++ (lub implementacji Boost, jeśli utkniesz w wersji językowej sprzed 2011 roku).

+0

To także nie będzie kompilować (lub najmniej niepoprawnie), ponieważ 'pthread_create' oczekuje funkcji, która zwraca wartość' void * ', a funkcja' Print_data' jest deklarowana jako 'void Print_data' - względnie łatwa do naprawienia przez dodanie '*' after 'void' i 'return NULL;' na końcu funkcji. –

+1

@MatsPetersson: Stąd ostatnia linia mojej odpowiedzi. Dodałem trochę więcej wyjaśnień na wypadek, gdyby inni tego nie zauważyli. –

+0

Zrobiłem dokładnie to, co powiedziałeś, Teraz dał mi kolejny błąd, który mówi niezdefiniowane odniesienie do pthread? – Zeyad

4

Starasz przekonwertować wskaźnik funkcji w void* tutaj: (void *) &Print_data

Według pthread_create trzeba przejść w funkcję, która pobiera i zwraca void*void*

Więc twój podpis funkcja powinna być

void* Print_data(void *ptr) 

a połączenie powinno być

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

pthread_create trwa trzeci argument jako

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

To void *(*start_routine)(void*) jest wskaźnik do funkcji, która zajmuje się void* wskaźnik i zwraca void* wskaźnik.

Kiedy robisz &Print_data i przekształcić wskaźnik void *, to znaczy, że są przechodzącą wskaźnik typu void* a nie wskaźnik typu void *(*start_routine)(void*) [funkcja wskaźnika].

się za prawidłowe, trzeba dokonać typ zwracany jako void* i wykonać połączenie jak pthread_create(&thread, NULL, &Print_data, NULL);

0

Dodaj plik nagłówka #include i skompilować g ++ -lpthread

+0

dodaj plik nagłówka #include i skompiluj g ++ -lpthread –

+0

To powinno być tylko komentarzem. To nie jest pełna odpowiedź – Raju