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 :

threads problème pour passer un tableau


Sujet :

C

  1. #1
    Membre du Club Avatar de royal380
    Homme Profil pro
    Apprenti Ingénieur
    Inscrit en
    Mai 2011
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Apprenti Ingénieur

    Informations forums :
    Inscription : Mai 2011
    Messages : 56
    Points : 54
    Points
    54
    Par défaut threads problème pour passer un tableau
    Bonjour à tous,
    après quelque recherche sur google je ne trouve toujours pas de solution à mon problème, mon but est de réaliser un jeu de "air hockey" en réseau.

    Je veux en faite passer les informations sur la position de la balle, et les positions des palets de chacun des 2 joueurs, par le biais d'un tableau de 6 cases.(position x et position y * 3)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    struct param
    {
        SOCKET socks;
        signed short nb;
        unsigned short Pos[6]; // ={1,2,3,4,5,6};
    };
    Fonction qui reçoit ce que l'ordinateur à l'adresse distante envoie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    void * recevoir(void * p_data)
    {
        struct param * toto = (struct param*) p_data;
        char buffer[50];
     
        signed short lon=50;
        printf("Reception  ONLINE\n");
     
        while (1)
        {
            lon=0;
     
            memset(buffer,0,sizeof(buffer));
            lon = recv(toto->socks,buffer,sizeof(buffer),0);
     
            memset((char *)toto->Pos,0,sizeof(toto->Pos) );
            recv(toto->socks,(char *)toto->Pos,sizeof(toto->Pos),0);
     
     
            if (lon == 50)
            {
                printf("\nkev dit: %s\n",buffer);
                printf("\nposition 0 = %c\n",toto->Pos[0]);
                printf("\nposition 1 = %c\n",toto->Pos[1]);
                printf("\nposition 2 = %c\n",toto->Pos[2]);
                printf("\nposition 3 = %c\n",toto->Pos[3]);
                printf("\nposition 4 = %c\n",toto->Pos[4]);
                printf("\nposition 5 = %c\n",toto->Pos[5]);
                toto->nb--;
                printf("compteur reception : %hd\n",toto->nb);
            }
        }
        printf("Conection serveur perdue");
    }
    J'envoie un message par le buffer avec le serveur et je regarde la valeur de mes Pos[x],et toutes les cases sont vides.

    Je ne vois pas pourquoi elles ne prennent pas les valeurs (1,2,3,4,5 et 6) que j'ai défini au début.

    Je n'ai aucune erreur de compilation ni de warning mon seul problème est que mes positions ne prennent pas les valeurs demandées.

    Merci pour vos réponses.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    peux-nous montrer comment tu envoies le tableau ?
    Par ailleurs, pourquoi lorsque tu le reçois, tu le cast en char * et pas en unsigned short * ?

  3. #3
    Membre du Club Avatar de royal380
    Homme Profil pro
    Apprenti Ingénieur
    Inscrit en
    Mai 2011
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Apprenti Ingénieur

    Informations forums :
    Inscription : Mai 2011
    Messages : 56
    Points : 54
    Points
    54
    Par défaut
    Je l'ai caste en char parce que apparemment "recv" demande un char.
    Enfin je suis pas allé vérifier


    Création des 2 threads :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    pthread_create(&thread_em,NULL,envoie,(void *)&mesparams);
    pthread_create(&thread_re,NULL,recevoir,(void *)&mesparams);
    Fonction d'envoi:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    void * envoie(void * p_data)
    {
        struct param * toto = (struct param*) p_data;
        char buffer[50];
     
        printf("Emission ONLINE\n");
        while (1)
        {
            memset(buffer,0,sizeof(buffer));//Ici, c'est la procédure pour envoyer
            scanf("%s",buffer);
            send(toto->socks,buffer,sizeof(buffer),0);
            memset((char *)toto->Pos,0,sizeof(toto->Pos) );
    	    send(toto->socks,(char *)toto->Pos,sizeof(toto->Pos),0);
     
            toto->nb++;
            printf("compte emission : %hd\n",toto->nb);
        }
    }

    Edit :
    Quand j'essaye avec unsigned short.

    In function `recevoir':
    warning: passing arg 2 of `recv' from incompatible pointer type|


    Prototype recv :
    int recv(int socket,char* buf,int len,int flags);

  4. #4
    Invité
    Invité(e)
    Par défaut
    Oui excuses-moi pour le cast, j'ai un prototype différent sur mon système, tu as bien fait donc

    Par contre si je comprends bien, dans ta fonction d'envoi, tu :
    - mets à zéro tous les champs de ton tableau : memset((char *)toto->Pos,0,sizeof(toto->Pos) );

    - puis tu envoies ton tableau vide : send(toto->socks,(char *)toto->Pos,sizeof(toto->Pos),0);

    C'est donc normal que tu reçoives un tableau vide

  5. #5
    Membre du Club Avatar de royal380
    Homme Profil pro
    Apprenti Ingénieur
    Inscrit en
    Mai 2011
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Apprenti Ingénieur

    Informations forums :
    Inscription : Mai 2011
    Messages : 56
    Points : 54
    Points
    54
    Par défaut
    Merci feydaykyn

    Il fallait aussi que j'enlève celui devant le recv ...

    Par contre maintenant j'ai une autre question

    Mes positions vont de 0 à 600, comme tu l'as vu je suis obligé de passer par un char ... soit 0 à 255 maximum

    Quelqu'un aurait une idée ?

  6. #6
    Invité
    Invité(e)
    Par défaut
    Cast-le ensuite en unsigned sort *

  7. #7
    Membre du Club Avatar de royal380
    Homme Profil pro
    Apprenti Ingénieur
    Inscrit en
    Mai 2011
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Apprenti Ingénieur

    Informations forums :
    Inscription : Mai 2011
    Messages : 56
    Points : 54
    Points
    54
    Par défaut
    J'ai essayé ça mais je dois mal le faire peut être lol
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        mesparams.Pos[0] = 450;
        mesparams.Pos[1]= 500;
        mesparams.Pos[2] = 1;
        mesparams.Pos[3]= 2;
        mesparams.Pos[4] = 12;
        mesparams.Pos[5]= 4;
    Ensuite le thread :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    unsigned short tab[6];
            tab[0] = toto->Pos[0] ;
            tab[1] = toto->Pos[1] ;
            tab[2] = (unsigned short) toto->Pos[2] ;
            tab[3] = (unsigned short) toto->Pos[3] ;
            tab[4] = (unsigned short) toto->Pos[4] ;
            tab[5] = (unsigned short) toto->Pos[5] ;
     
                printf("\nposition 0 = %d\n",tab[0]);
                printf("\nposition 1 = %d\n",tab[1]);
                printf("\nposition 2 = %d\n",tab[2]);
                printf("\nposition 3 = %d\n",tab[3]);
                printf("\nposition 4 = %d\n",tab[4]);
                printf("\nposition 5 = %d\n",tab[5]);
    Il se passe la même chose que je caste ou pas ...
    Je peut afficher mon 500 sans caste..

  8. #8
    Invité
    Invité(e)
    Par défaut
    En fait, au moment où tu fais l'affectation dans "tab", un cast implicite est fait par le compilateur, donc dans ce cas le cast n'est pas nécessaire.

    Est-ce que c'est cela qui te dérangeais ?

  9. #9
    Membre du Club Avatar de royal380
    Homme Profil pro
    Apprenti Ingénieur
    Inscrit en
    Mai 2011
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Apprenti Ingénieur

    Informations forums :
    Inscription : Mai 2011
    Messages : 56
    Points : 54
    Points
    54
    Par défaut
    Tout à fait

    Je marque le sujet résolu merci encore

    Edit :
    Euh il faut taper quoi pour passer le sujet en résolu car je remarque que :

    "[Résolu] Titre du premier message" ne fonctionne pas

  10. #10
    Invité
    Invité(e)
    Par défaut
    De rien:-)

    Il doit y avoir un bouton "resolu" quelque part, mais je ne sais pas où désolé !

  11. #11
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 373
    Points : 23 629
    Points
    23 629
    Par défaut
    Citation Envoyé par royal380 Voir le message
    Euh il faut taper quoi pour passer le sujet en résolu car je remarque que : "[Résolu] Titre du premier message" ne fonctionne pas
    Citation Envoyé par feydaykyn Voir le message
    Il doit y avoir un bouton "resolu" quelque part, mais je ne sais pas où désolé !
    En principe, le bouton se trouve en bas de la page, juste après le dernier commentaire. Il n'est visible que par l'auteur de la discussion.

  12. #12
    Membre du Club Avatar de royal380
    Homme Profil pro
    Apprenti Ingénieur
    Inscrit en
    Mai 2011
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Apprenti Ingénieur

    Informations forums :
    Inscription : Mai 2011
    Messages : 56
    Points : 54
    Points
    54
    Par défaut
    +1

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 11/03/2013, 15h04
  2. Réponses: 1
    Dernier message: 25/01/2013, 16h25
  3. [JSP] Problème pour passer un array comme paramètre
    Par MxPx_23 dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 06/06/2006, 17h13
  4. [Tableaux] Problème pour contrôler un tableau
    Par renaud26 dans le forum Langage
    Réponses: 5
    Dernier message: 10/04/2006, 11h45
  5. Thread problème pour l'arreter
    Par rvzip64 dans le forum Langage
    Réponses: 8
    Dernier message: 12/07/2005, 10h51

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