C++ pthread_create , souci avec les parramettres

Hello

J’ai un petit problème avec le code suivant:

[code]
#include “pthread.h”
#include
#include <stdio.h>
#include <stdlib.h>
volatile char theChar = ‘\0’;
volatile char afficher = 0;

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 ?

Je compile avec g++ pour du c++
je me suis inspirer de la page suivate:
jean-luc.massat.perso.luminy.uni … hread.html
j’ai trouver de la doc ici
mtodorovic.developpez.com/linux/ … age_4#L4-1

Merci d’avance

Tes fonctions de thread (lire() et affichage()) doivent prendre un argument de type void* pas le choix :

void* lire(void*) { // ... }

Si tu ne donnes pas de nom à l’argument (exactement comme j’ai marqué au dessus quoi) je crois que ça ne devrait pas râler.

Merci pour ta réponse. Le C et les pointeur c’est pas évident. :doh:

d’ailleurs void * sa veux dire quoi exactement?

rien qui pointe sure un élément inconnu ?? (pour moi le mots void = rien)

j’ais juste ?

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).

je suppose que si on passe une structure il n’y a pas lieux de faire un cast ?

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]

Oki Piger , bon reste a pratiquer histoir de pas perdre de vu ce qui a été dit .
Merci pour tes réponses :handgestures-thumbup:

Juste pour mettre mon grain de sel.

Ce n’est pas nécessaire, mais ça n’est pas interdit non plus. Ça peut être utile de rendre les conversions visibles dans le 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++. :wink:
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).