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

Réseau C Discussion :

instruction pas trop claire


Sujet :

Réseau C

  1. #1
    Membre à l'essai
    Inscrit en
    Avril 2013
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Avril 2013
    Messages : 14
    Points : 10
    Points
    10
    Par défaut instruction pas trop claire
    salut tout le monde,
    j'ai une instruction devant mes mains que je ne peux pas comprendre, elle me parait un peu chelou j'aurai aimé que quelqu'un m'aider à comprendre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    //message est une structure qu'on a définie quelque part dans le code et qui contient le champ packet
    void fontion(message *msg)
    {
    x* hdr = (x*)msg->packet;
    //et la vient la partie que je ne comprends pas ?? :(
    }
    je sais qu'on vient de déclarer hdr comme étant un pointeur de te type x mais la suite je ne comprends pas trop, je remercie toute personne va me répondre à l'avance .

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 369
    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 369
    Points : 23 623
    Points
    23 623
    Par défaut
    Bonjour,

    Un type seul (aussi sophistiqué soit-il) inclus dans des parenthèses avant une expression évaluable est un « transtypage » (ou cast). Il sert à convertir la valeur qui le suit immédiatement vers le type en question.

    Donc, en l'occurence, on affecte à hdr la valeur de msg->packet en précisant bien que cette valeur est un pointeur vers le type x. C'est nécessaire parce que packet doit probablement être un pointeur vers le contenu du paquet qui, lui, peut être n'importe quoi. packet doit probablement être un « void * » ou un « char * », et on le spécialise vers quelque chose d'un peu plus instructif.

  3. #3
    Membre à l'essai
    Inscrit en
    Avril 2013
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Avril 2013
    Messages : 14
    Points : 10
    Points
    10
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    Bonjour,

    Un type seul (aussi sophistiqué soit-il) inclus dans des parenthèses avant une expression évaluable est un « transtypage » (ou cast). Il sert à convertir la valeur qui le suit immédiatement vers le type en question.

    Donc, en l'occurence, on affecte à hdr la valeur de msg->packet en précisant bien que cette valeur est un pointeur vers le type x. C'est nécessaire parce que packet doit probablement être un pointeur vers le contenu du paquet qui, lui, peut être n'importe quoi. packet doit probablement être un « void * » ou un « char * », et on le spécialise vers quelque chose d'un peu plus instructif.
    tout d'abord merci, ton explication est vraiment claire et je comprends maintenant cette syntaxe, mais ce que je ne comprends pas bien est :
    msg->packet est un pointeur vers un paquet(c'est le paquet que je reçois par paramètre et je dois retransmettre par cette fonction ), si le paquet vers lequel msg->packet pointe, contient peut être void ou bien du n'importe quoi alors sa sert à quoi d'affecter dans hdr l'adresse d'une variable qui contient probablement n'importe quoi?

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 369
    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 369
    Points : 23 623
    Points
    23 623
    Par défaut
    Disons que ton packet peut contenir n'importe quel type de données mais à partir du moment où tu sais à l'avance de quoi il s'agit, alors tu peux transtyper ton pointeur histoire d'aller directement piocher dedans.

    En émission, ça a moins d'importance bien sûr mais, apparemment, le champ « hdr » doit vouloir dire « header ». Autrement dit, le paquet que tu reçois en argument doit t'être livré avec son entête réseau qui, lui, est toujours formé de la même façon quelle que soit la charge utile. Et comme, par définition, ton entête se trouve au début de ton paquet, son adresse coïncide avec celle du paquet tout entier. Affecter l'adresse du paquet à un pointeur « hdr » de type « x » doit pouvoir te permettre d'aller examiner, en quelque sorte, « l'étiquette de ton colis ».

  5. #5
    Membre émérite
    Avatar de skeud
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2011
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 1 091
    Points : 2 724
    Points
    2 724
    Billets dans le blog
    1
    Par défaut
    Je vais te donné un exemple simple .

    Dans ton cas, je suppose que c'est en rapport avec le reseau.

    Imaginons qu'on fasse un jeu en reseau, on aura besoin d'échanger des données entre le client et le serveur.
    Pour échangé les donné, on va créer la structure message

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    struct message {
    int size; //taille de la donnée
    int type; //type de donné (1=joueur, 2=objet)
    void* data; //donnée à transférer
    }
    size contient la taille de data.
    Si on veux échanger des données en rapport avec le joueur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    struct joueur {
    int id;
    int posx;
    int posy;
    }
    ou un objet

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    struct objet {
    int id;
    int nb;
    int type;
    }
    il suffira de procédé comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    struct joueur* monJoueur;
    struct message envoi;
    envoi.type=1;
    envoi.size = sizeof(monJoueur);
    envoi.data = monJoueur;
    send(&envoi, sizeof(envoi)+envoi.size)
    ou pour un objet:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    struct objet* monObjet;
    struct message envoi;
    envoi.type=2;
    envoi.size = sizeof(monObjet);
    envoi.data = monObjet;
    send(&envoi, sizeof(envoi)+envoi.size)
    ensuite, coté client, on le récupère de cette manière:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    struct message recept;
    read(&recept, sizeof(recept));
    read(recept.data, recept.size);
    à ce moment, il suffit de savoir si c'est un objet ou un joueur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if (recept.type == 1)
      receptJoueur(&message);
    else
      receptObjet(&message);
    Et dans chacune des fonction, tu auras le cast pour pouvoir traiter l'objet tel qu'il est réellement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void recepObjet (message* mes)
    {
      struct objet *obj = (struct objet*)(mes->data);
      // à partir de la on peut directement accéder à obj->id, pour utiliser l'objet et effectuer des traitement dessus
    }
     
    void receptJoueur(message* mes)
    {
      struct joueur* j = (struct joueur*)(mes->data);
      //pareil qu'au dessus mais pour faire des traitement sur le joueur
    }
    Cette utilisation permet de transitter des information sur le reseau peu importe le format de donné (joueur ou objet) en gardant la meme structure et permettant de se le trimballer un peu partout pour "transformer" la donnée transité qu'au moment où tu t'en sert vraiment.

    J'espère avoir été clair .
    Pas de solution, pas de probleme

    Une réponse utile (ou +1) ->
    Une réponse inutile ou pas d'accord -> et expliquer pourquoi
    Une réponse à votre question


  6. #6
    Membre à l'essai
    Inscrit en
    Avril 2013
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Avril 2013
    Messages : 14
    Points : 10
    Points
    10
    Par défaut
    Merci tous les deux,énormément.

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

Discussions similaires

  1. Instruction pas claire
    Par eya02 dans le forum OpenCV
    Réponses: 2
    Dernier message: 26/12/2009, 19h05
  2. Instructions pas claires
    Par eya02 dans le forum OpenCV
    Réponses: 2
    Dernier message: 09/12/2009, 14h14
  3. API Windows , c'est pas trop clair
    Par ..::snake::.. dans le forum Windows
    Réponses: 9
    Dernier message: 15/02/2008, 17h44
  4. [CSS] Instruction Padding : FireFox pas trop comprendre ?
    Par DemonKN dans le forum Mise en page CSS
    Réponses: 9
    Dernier message: 11/08/2005, 15h23

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