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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti 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
    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 averti 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
    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 averti 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
    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 *

+ 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