void* lire ()
{
do {
while (afficher == 1) ; /* attendre mon tour /
theChar = getchar();
afficher = 1; / donner le tour */
} while (theChar != ‘F’);
return NULL;
}
void* affichage ()
{
int cpt = 0;
do {
while (afficher == 0) cpt ++; /* attendre /
std::cout << "Thread " << std::endl;
afficher = 0; / donner le tour */
}
while (theChar != ‘F’);
return NULL;
}
int main (void)
{
pthread_t filsA, filsB;
//std::string SendA= “AA”;
//std::string SendB= “BB”;
if (pthread_create(& filsA, NULL, affichage,NULL)) {
perror(“pthread_create”);
exit(EXIT_FAILURE);
}
if (pthread_create(&filsB, NULL, lire,NULL)) {
perror(“pthread_create”);
exit(EXIT_FAILURE);
}
if (pthread_join(filsA, NULL))
perror("pthread_join");
if (pthread_join(filsB, NULL))
perror("pthread_join");
printf("Fin du pere\n") ;
return (EXIT_SUCCESS);
}
l’erreur:
main.cpp:36: error: invalid conversion from ‘void* (*)()’ to ‘void* (*)(void*)’
main.cpp:40: error: invalid conversion from ‘void* (*)()’ to ‘void* (*)(void*)’
j’ai mis NULL pour que le message d’erreur soie plus explicit, avidement si je met une valeur qui … va servir a rien
Cela va donner un avertissent comme quoi la variable ne sera pas utilisée a la compilation.
si je met une variable il faut qu’elle soie passer par référence. ensuite dans la fonction je doit m’en servir pour ne rien faire…
une idée pour que je me passe de la variable et que cela ne “miaule” pas ?
ou une autre manière de faire peut être ?
Utilisé tout seul (en retour de fonction) void = rien, effectivement.
Par contre void* signifie : un pointeur vers un type inconnu (et il faudra forcément utiliser un cast avant de déréférencer la variable).
La conversion de type* vers void* se fait automatiquement sans cast, mais la conversion de void* vers type* nécessite un cast. Structure ou pas ça ne change rien.
[code]void* fonction(void* arg) {
//…
}
int main() {
int var = 1;
int* ptr1 = &var;
int* ptr2 = (int*)fonction(ptr1); // et non pas (int*)fonction((void*)ptr1);
//…
}[/code]
[quote=“MisterFreez”]int* ptr2 = (int*)fonction(ptr1); // et non pas (int*)fonction((void*)ptr1);
Ce n’est pas nécessaire, mais ça n’est pas interdit non plus.[/quote]
Ça dépend si on parle de C ou de C++.
En C effectivement tu n’as pas besoin de faire un cast explicite de void* vers type* (j’avoue, ça m’était complètement sorti de la tête) mais en C++ il faut obligatoirement faire un cast.
g++ confirme, en me sortant l’erreur suivante :
Et si on va voir dans le man de gcc pour l’option -fpermissive, ça confirme à nouveau qu’on est face à du code non conforme (bien qu’avec l’option -fpermissive gcc puisse n’émettre qu’un warning au lieu de l’erreur que le standard C++ requiert).