Почему pthread_join дает эту ошибку? [Ошибка] неверное преобразование из 'void *' в 'void **' [-fpermissive] - PullRequest
3 голосов
/ 16 марта 2019

Я слежу за этим приложением по своей книге, и я попытался скопировать эту программу и посмотреть, что она делает.

С большим удивлением я обнаружил, что она не работает !!

Программа выглядит следующим образом:

#include<stdio.h>
#include<stdlib.h>
#include<pthread.h>
#include <time.h>

#define TANTI 10
int parametroOUT;

void* codice(void *arg){
    srand(time(NULL)); 
    parametroOUT=(rand()%6)+1;
    pthread_exit((void*)&parametroOUT);
}

int main(){
    int dadoEstratto, *risultato=0;
    pthread_t t1;
    pthread_create(&t1,NULL,codice,NULL);   
    pthread_join(t1, (void*) &risultato);
    printf("dado estratto: %d",*risultato);
    return 0;                                           
}

Возвращает ошибку в строке: pthread_join(t1, (void*) &risultato);.

Ошибка:

[Ошибка] неверное преобразование из 'void *' в 'void **' [-fpermissive]

Как я могу исправить эту ошибку?

Ответы [ 3 ]

1 голос
/ 16 марта 2019

Этот код неверен:

int *risultato=0;
...
pthread_join(t1, (void*) &risultato);

Прототип для pthread_join():

int pthread_join(pthread_t thread, void **value_ptr);

Обратите внимание, что это void **. Это потому, что функция, используемая для запуска потока, возвращает void *. Чтобы получить доступ к void *, возвращенному функцией запуска потока, вам нужно передать адрес void *, чтобы pthread_join() мог заполнить значение:

void *risultato=0;
...
pthread_join(t1, &risultato);

Обратите внимание, что risultato теперь является правильным void *, и его адрес передается в pthread_join() с помощью оператора & address-of.

Чтобы вернуться к int возвращаемому значению функции codice():

int *intPtr = ( int * ) risultato;
int value = *intPtr;
0 голосов
/ 16 марта 2019

Я решил свою проблему с помощью этой простой функции, спасибо всем, кто помог мне

#include<stdio.h>
#include<stdlib.h>
#include<pthread.h>
#include <time.h>
#define TANTI 10
int dadi[TANTI];
int i=0; 
void* codice(void *arg){

	while(i<TANTI){
    srand(time(NULL);
		dadi[i]=rand() % 6 + 1;
		printf("il dado estratto e': %d\n",dadi[i]);
		i++;
				  }
	pthread_exit(0);			  
					   }
int main(){
	int dadoEstratto;
	pthread_t t1;
	pthread_create(&t1,NULL,codice,NULL);
	pthread_join(t1,NULL);
	return 0;											
		}
0 голосов
/ 16 марта 2019

Второй аргумент должен иметь тип void**.

Вот что вы должны сделать:

void *risultato_voidp;
pthread_join(t1, &risultato_voidp);
resultato = static_cast<int*>(risultato_voidp);

Полный пример:

#include<stdio.h>
#include<stdlib.h>
#include<pthread.h>
#include <time.h>
#include <errno.h>
#define TANTI 10
int parametroOUT;
void* codice(void *arg){
    srand(time(NULL));
    parametroOUT=(rand()%6)+1;
    pthread_exit(static_cast<void*>(&parametroOUT));
}
int main(){
    int dadoEstratto, *risultato=0;
    void *risultato_voidp;
    pthread_t t1;
    int er;
    if(0!=(er=pthread_create(&t1,NULL,codice,NULL))) return errno=er,perror(0),1;
    pthread_join(t1, &risultato_voidp);
    risultato = static_cast<int*>(risultato_voidp);
    printf("dado estratto: %d\n",*risultato);
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...