begin process at 2012 05 29 22:36:06
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

Au secours

 > 

Probleme threads


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Probleme threads

mardi 9 mai 2006 à 12:01:27 | Probleme threads

turnerom

Bonjour,
je n'arrive pas à compiler ce petit programme servant a illustrer mon problème :


#include <iostream>
#include <pthread.h>

using namespace std;

static pthread_mutex_t mutex;

struct Foo
{
    string f;
    Foo();
    ~Foo();
    void* affiche(void *p_data);
};

Foo::Foo ()
{
    string tmp("Je suis Foo");
    f=tmp;
}

Foo::~Foo()
{ }

void* Foo::affiche(void *p_data)
{
    cout << f << endl;
    return NULL;
}


int main()
{
    pthread_mutex_init (&mutex, NULL);

    pthread_t thrd1;

    Foo f;

    pthread_create(&thrd1,NULL,f.affiche,NULL);

    pthread_join(thrd1, NULL);

    cout << "Fin" << endl;

    return 0;
}


Ce programme ne fait pas grand chose, il sert juste d'illustration au problème que je rencontre.

Pourquoi le compilo me dit-il :
fichier.cpp:40: error: argument of type `void*(Foo::)(void*)' does not match `void*(*)(void*)'

Et comment résoudre mon problème.
D'avance merci !

TuRn3r
mardi 9 mai 2006 à 12:08:36 | Re : Probleme threads

AlexN

c'est pas class Foo que tu voulais écrire au lieu de struct Foo ?
mardi 9 mai 2006 à 12:08:53 | Re : Probleme threads

laurent1024

Membre Club
Peux etre que ca vient du faite que Foo est une structure et pas une classe
++
mardi 9 mai 2006 à 12:10:06 | Re : Probleme threads

laurent1024

Membre Club
Excuses  pour la répétition, AlexN a ete plus rapide

mardi 9 mai 2006 à 12:29:05 | Re : Probleme threads

turnerom

Non, ca ne vient pas de la.
Dans mon prog j'ai bien class et j'ai la meme erreur.
De plus une structure n'est jamais qu'une classe ou tout les membres sont publics.

En fait:
struct Foo
{
    string f;
    Foo();
    ~Foo();
    void* affiche(void *p_data);
};

est absolument equivalent a:
class Foo
{
    public :
        string f;
        Foo();
        ~Foo();
        void* affiche(void *p_data);
};

Mais merci quand meme !

TuRn3r
mardi 9 mai 2006 à 12:50:00 | Re : Probleme threads

AlexN

Hum si les structures c'etaient stricto senso la même chose qu'une classe, personne les aurais inventé.

Ok syntaxiquement ça se ressemble. Mais les traitements et les propriétés d'une structure et d'une classe sont très très différents...Entre autres, ta fonction Foo() pour la structure est juste une fonction, tandis que pour la classe Foo c'est un constructeur.

En ce qui concerne les structure auto reférentes, il faut toujours faire préceder la définition de la structure par une declaration du type pointeur sur struct. Tu ne peux pas declarer la classe Foo, avant de l'avoir défini. Le compilateur ne connait pas la taille avant la definition. Il ne connait que la taille d'un pointeur.


mardi 9 mai 2006 à 13:53:33 | Re : Probleme threads

turnerom

Admetons!
dans le cas suivant alors, d'ou peut provenir l'erreur svp ?

#include <iostream>
#include <pthread.h>

using namespace std;

static pthread_mutex_t mutex;

class Foo
{
    public:
        string f;
        Foo();
        ~Foo();
        void* affiche(void *p_data);
};

Foo::Foo ()
{
    string tmp("Je suis Foo");
    f=tmp;
}

Foo::~Foo()
{ }

void* Foo::affiche(void *p_data)
{
    cout << f << endl;
    return NULL;
}


int main()
{
    pthread_mutex_init (&mutex, NULL);

    pthread_t thrd1;

    Foo f;

    pthread_create(&thrd1,NULL,f.affiche,NULL);

    pthread_join(thrd1, NULL);

    cout << "Fin" << endl;

    return 0;
}


Pourquoi le compilo me dit-il :
fichier.cpp:40: error: argument of type `void*(Foo::)(void*)' does not match `void*(*)(void*)'

Et comment résoudre mon problème.
D'avance merci !

TuRn3r
mardi 9 mai 2006 à 14:45:43 | Re : Probleme threads

AlexN

Ligne 40 c'est laquelle ?
vient du parametre de pthread_create() ? Le compilateur semble te dire qu'il attend un paramatère de type void*(*)(void*).
tentes un cast void*(*)(void*) sur le paramètre f.affiche()

mardi 9 mai 2006 à 14:55:15 | Re : Probleme threads

turnerom

Non, je viens d'essayer, pas mieu.

La ligne 40, qui pose problème est celle-la:
pthread_create(&thrd1,NULL,f.affiche,NULL);

TuRn3r
mardi 9 mai 2006 à 16:20:08 | Re : Probleme threads

AlexN

Réponse acceptée !
Il s'agit d'un problème de transtypage, mais je ne vois pas trop non plus. pcreate_thread ne semble pas aimer les parametres de type fonction membre ou le transtypage n'est pas écrit correctement.
Il doit y avoir un moyen de forcer mais je ne vois pas. désolé.

essayes ça : c'est pas la bonne solution mais ça compile semble-t-il

void * p (void *t) {
 ((Foo *)t)->affiche(t);
}

int main()
{
    pthread_mutex_init (&mutex, NULL);

    pthread_t thrd1;

    Foo f;
    pthread_create(&thrd1,NULL,p,(void *)&f);

    pthread_join(thrd1, NULL);

    cout << "Fin" << endl;

    return 0;
}

Par contre si quelqu'un comprend son problème je suis aussi preneur !


1 2

Cette discussion est classée dans : problème, void, pthread, mutex, foo


Répondre à ce message

Sujets en rapport avec ce message

Problème utilisation pthread avec option static [ par ajollive ] Bonjour, j'ai un code qui gère un système multithreadé avec des mutex. J'ai une interface HTTP qui me permet d'ajouter ou de killer des threads. La p Sdl_net + pthread probleme d'argument [ par Defaite ] Bonjour à tous.Voila mon problème, j'ai une thread ( en Pthread ) qui devrait s'occuper d'un socket.Seulement voila, impossible de dire à ma thread co ARRTER UN PTHREAD [ par sebastienmz ] Bonjours tlmje voudrais savoire comment on arrete un thread sous linux avec la librairie pthread.hen fait mon problème je lance un thread et a un mome [UNIX]1 producteur N consomateurs [ par epmi212 ] bonjour je doit rendre le probleme 1 prducteur N consomateurs la semaine prochaine mais j'ai un probleme de code je vois le probleme est ce que vous probleme (segmentation) d'execution d'un thread [ par krusty24 ] salut tout le monde j'ai besoin de votre aide pour m'aider a resoudre un petit probleme d'execution de mon programme en C-ANSI ce programme permet de C(Linux)thread [ par noussa1985 ] st tt le monde SVP eske qqu'1 pe m'aider à ecrire un code en C(Linux) en utilisant les threadsMon pgm permet de calculer le carré des entiers entre 0 Problème d'analyse sur polymorphisme [ par vinc1008881 ] Bonjour à tous, Je me permets de solliciter votre expérience pour résoudre un petit problème qui me turlupine depuis qques jours... Je m'explique : Problème <list> destructeur [ par exar ] Bonjour à tous !  J'espère que quelqu'un pourra m'aider.Voiloà mon problème:  j'ai créé une classe abstraite (nommons-la A) et deux classes filles (di Problème avec string [ par visualstar ] Bonjour, J'ai un problème en C++ avec les string.Comment peut-on faire pour passer un string à une fonction. Dans cette fonction, je fais un cin ; mai Probleme thread linux ... [ par Tidam ] Voila mon probleme, quand je ve compiler il me sort une erreur : passing `void (*)(void *)' as argument 3 of `pthread_create(pthread_t *, const pthrea


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 2,496 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales