C ++ PTHREADS - Неверное преобразование void * (*) () в void * (*) (void *) - PullRequest
0 голосов
/ 19 октября 2018

Я должен отправить параметр "r" типа "risposta" в функцию RispostaServer.Компилятор дает мне: invalid conversion void*(*)() to void*(*)(void*)

Вот фрагмент кода, который я должен исправить:

{/*other istructions*/
risposta r;
r.mess = m1;
r.codaSC = codaSC;
pthread_create(&threads[threads_index],&attr,RispostaServer,(void*)&r);
threads_index++;
}

void* RispostaServer(void* m){
risposta* m1 = (risposta*) m;
/*other istructions*/
}

Что я должен отредактировать?Я пытаюсь это часами.

1 Ответ

0 голосов
/ 19 октября 2018

Я сделаю удар в темноте, предварительно [MCVE] (но, пожалуйста, предоставьте его).

Ваше объявление для RispostaServer выглядит так?

void* RispostaServer();

Тогда единственная версия RispostaServer, видимая для вызова pthread_create, это та, которая не принимает аргумент.Это соответствует жалобе типа, выдвинутой компилятором.

Ваша более поздняя функция определение создает новую перегрузку RispostaServer, что действительно принимает аргумент, и вы 'Я мог бы вызывать этот код ниже, но к тому времени это слишком поздно для вызова pthread_create.

Объявление должно соответствовать определению:

// Entrypoint for Risposta worker thread.
// Argument must be a risposta*, cast to `void*`.
void* RispostaServer(void* m);

Кстати,ваш поток будет разорван, потому что вы передаете указатель на локальную переменную, которая немедленно выходит за рамки видимости, поэтому добавьте следующий комментарий к приведенному выше:

// The risposta it points to must exist for the lifetime
// of the thread.

… и вам действительно следует использоватьstd::thread, а не C API библиотеки для конкретной платформы.

...