IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Thread et Arguments


Sujet :

C

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 28
    Points : 9
    Points
    9
    Par défaut Thread et Arguments
    Bonjour,

    J'essaye de faire passer une structure en argument lors de la création de mon thread, j'obtiens un warning.
    Puis lorsque je tente de récupérer les paramètres dans la fonction chargée par le thread, rebelotte erreur

    Je vous montre ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    static Thread Liste_Arguments[10];
     
    int main ()
    {
    pthread_t thread[10];
    for(i= 0; i<9; i++)
    {
       Liste_Arguments[i].pipe_lecture = fdpipe_in[i][R];
       Liste_Arguments[i].pipe_ecriture = fdpipe_out[i][W];
       Liste_Arguments[i].term_id = i;
       pthread_create(&thread[i], NULL, thread, (void *)&Liste_Arguments[i]);
    }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void *thread (void *arg)
    {
    	/* On fait une "copie" pour ne pas modifier la structure passee en argument */
    	Thread Cpy_Args;
     
    	/* On recupere chaque argument */
    	Cpy_Args.pipe_lecture  = (Liste_Arguments *)arg-> pipe_lecture;
    	Cpy_Args.pipe_ecriture = (Liste_Arguments *)arg-> pipe_ecriture;
    	Cpy_Args.term_id = (Liste_Arguments *)arg-> term_id;

    Ma structure déclarée dans le header :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    typedef struct Thread Thread;
    struct Thread
    {
    	int pipe_lecture; /* Le pipe sur lequel le thread va lire */
    	int pipe_ecriture; /* Le pipe sur lequel le thread va écrire */
    	int term_id; /* Le numéro du terminal que le thread va observer */
     
    };


    Voilà ça devrait suffire.

    Donc dans ma console j'ai :

    arnaud@debian:91: warning: passing argument 3 of ‘pthread_create’ from incompatible pointer type
    /usr/include/pthread.h:227: note: expected ‘void * (*)(void *)’ but argument is of type ‘pthread_t *’
    arnaud@debian: In function ‘thread’:
    arnaud@debian:110: error: expected expression before ‘)’ token
    arnaud@debian:111: error: expected expression before ‘)’ token
    arnaud@debian:112: error: expected expression before ‘)’ token
    Les lignes 110,111,112 correspondent à la phase de récupération des arguments (Cpy_Args....)


    Help

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Points : 1 750
    Points
    1 750
    Par défaut
    C'est normal, thread est à la fois le nom d'un tableau de ta fonction main, mais aussi celui d'une fonction. Ton compilateur va filer comme 3ème argument de ta fonction pthread_create non pas l'adresse de ta fonction mais l'adresse de ton tableau.
    Il faut éviter les noms d'objets ou de fonctions qui provoquent ce genre d'ambigüités.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 28
    Points : 9
    Points
    9
    Par défaut
    Oui c'était stupide de ma part...

    La triple erreur est toujours présente, j'ai beau avoir retourné le truc 20fois je ne comprends pas pourquoi.

    *arg est un pointeur sur ma structure, je le cast pour qu'il retrouve le type de ma structure, et j'accède aux champs de ma structure grâce aux flèches puisque c'est un pointeur (plus rapide que de faire (*arg).fd_lecture etc...

    Peut être une erreur au moment du passage en paramètres ? Mais là encore ce que je trouve sur le net à l'air de confirmer ce que j'ai fais.

    Alala le C

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Thread avec argument
    Par n33dw33d dans le forum C#
    Réponses: 12
    Dernier message: 04/05/2011, 10h20
  2. Réponses: 1
    Dernier message: 14/08/2009, 12h29
  3. passer un tableau d'arguments à un thread
    Par madimane dans le forum POSIX
    Réponses: 5
    Dernier message: 14/04/2006, 07h08
  4. Réponses: 1
    Dernier message: 08/03/2006, 20h06
  5. [MFC] Envoyez un argument au thread
    Par Oberown dans le forum MFC
    Réponses: 3
    Dernier message: 23/08/2004, 16h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo