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 :

Parcours d'une structure


Sujet :

C++

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 81
    Par défaut Parcours d'une structure
    Bonjour,

    Je travaille sur une bibliothèque de transfert de données entre des machines qui n'ont pas le même format de codage bits (little endian vs big endian).
    L'inversion des bits est gérée pour des types "classiques" : entier 32 bits, 64 bits, float, double, ...

    Le problème se pose alors pour les structures telles que la suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     typedef struct{
      long L1,L2,L3,L4; 
      float F1,F2;
      double D1,D2,D3; 
      char C1,C2;
      long L5;
    }DUMMY;
    L'idée est de gérer la détection des tailles des variables constituant la structure automatiquement afin de pouvoir réutiliser les fonctions basiques évoquées ci-dessus. L'objectif est de fournir à l'utilisateur une fonction qui prend en paramètre la structure de données et qui est capable d'en extraire les types.

    Est-il donc possible de balayer tous les champs d'une structure sans en connaître à l'avance les noms ? Une sorte de for each en fait.

    Merci.

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Non, il faudra au moins écrire une fonction qui permettra d'envoyer ta structure en envoyant chacun de ses membres un à un.
    C'est le même principe que les flux standards : les opérateurs << et >> sont définis pour les types de base du langage, mais tu peux très facilement étendre ce comportement pour tes types persos en écrivant des opérateurs << et >>.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 81
    Par défaut
    Salut,

    C'est justement ce que je ne veux pas faire. Le principe de la bilbiothèque est vraiment que l'échange des données soit transparent pour l'utilisateur.
    Il a juste à créer sa structure, la mettre à jour et l'envoyer d'un bloc sur le réseau.

    Le point bloquant pour l'instant est qu'il est nécessaire d'inverser certains octets dont on ne connait ni le nombre ni l'ordre d'apparition. C'est donc l'utilisateur qui est responsable actuellement de fournir ces informations. Si je reprend la stucture DUMMY, cela donnerait quelque chose de ce type :
    32, 32, 32, 32, 32, 32, 64, 64, 64, 16, 32 où le nombre correspond au nombre de bits successifs à inverser.

    Ce n'est pas un effort énorme à fournir mais c'est potentiellement une source de bugs en cas d'inattention, par exemple une modification de la structure qui ne serait pas répercutée sur la suite de nombre !
    C'est pour cela que je voudrais le faire de façon automatique.

    On m'avait parlé d'analyseur syntaxique type Yacc/Lex qui pourrait faire cela mais cela me semble disproportionné vu ce qu'il y a à faire.

    Je pensais également à analyser une string qui contiendrait la définition de la structure :

    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
     typedef struct{
      long L1,L2,L3,L4; 
      float F1,F2;
      double D1,D2,D3; 
      char C1,C2;
      long L5;
    }DUMMY;
     
    char * str = "\
     typedef struct{\
      long L1,L2,L3,L4; \
      float F1,F2;\
      double D1,D2,D3; \
      char C1,C2;\
      long L5;\
    }DUMMY;";
    Le problème est que ce n'est pas forcément facile de gérer tous les dénominations de types qui font référence à des types de base, comme les types BYTE, DWORD, ... que l'on trouve sous Windows.

    Enfin, si quelqu'un a une idée, je le remercie d'avance.

  4. #4
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 288
    Billets dans le blog
    2
    Par défaut
    Je ne sais pas si ça pourra aider, mais je sais que la lib gSoap (c'est un peu plus qu'une lib en fait) fait ce que tu cherches à faire. Pour faire court, gSoap créé un client et un serveur, ainsi que les fonctions qui permettent des échanges de données entre les deux, tout ça à partir des headers d'une classe. Et gSoap est open source.

  5. #5
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    Salut,

    Citation Envoyé par G3G3
    C'est justement ce que je ne veux pas faire. Le principe de la bilbiothèque est vraiment que l'échange des données soit transparent pour l'utilisateur.
    (...)
    Je pensais également à analyser une string qui contiendrait la définition de la structure
    Ca ne me parait pas très logique

    Je pense que tu ne t'en tireras pas sans obliger l'utilisateur à rajouter de l'information, au mieux sous forme de macros...

    Pourquoi ne pas vouloir utiliser la sérialisation standard à base d'opérateurs << et >> comme suggéré ?
    Au moins les utilisateurs ont l'habitude de ça.

    MAT.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 81
    Par défaut
    r0d >> merci pour l'info sur SOAP, je vais y regarder de plus près. J'espère y trouver ce que je cherche.

    MAT >> Le problème est que cette bibliothèque ne s'adresse pas forcément à des informaticiens et que certaines notions (serialisation, surcharge d'opérateurs, etc. ) leur sont étrangères donc à éviter. L'objectif est vraiment d'avoir le formalisme le plus simple possible.

    J'étudie le problème et je ferais dans le "classique" s'il n'y a pas d'autres solutions.

    Merci.

  7. #7
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Pour gérer l'échange de données binaire, outre les problèmes d'endianness que tu as évoqués, il y a les problèmes de type n'ayant pas la même taille d'une plateforme à l'autre, et les problèmes d'alignements qui font que par exemple sur certaines plate-formes, les deux structures suivantes ont des tailles différentes (exemple fourni de tête avec msdev/windows):

    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
    struct S1
    {
      char c1;
      int i;
      char c2;
    };
     
    struct S2
    {
      int i;
      char c1;
      char c2;
    };
     
    assert(sizeof(S1) == 12);
    assert(sizeof(S2) == 8);
    A part ça, comme le C++ n'est pas réflexif, je doute que tu trouves une solution directe. Maintenant, si tes utilisateurs ne sont pas à même de comprendre un truc du genre :

    Citation Envoyé par Documentation (j'ai pris une syntaxe inspirée de boost::serialization)
    Le C++ est bête, pour savoir comment transmettre la donnée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     struct DUMMY{
      long L1,L2,L3,L4; 
      float F1,F2;
      double D1,D2,D3; 
      char C1,C2;
      long L5;
    };
    Il faut lui dire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SERIALIZATION_DEFINITION
    {
      ar & L1 & L2 & L3 & L4 & F1 & F2 & D1 & D2 & D3 & C1 & C2 & L5;
    }
    je pense qu'il ne faut pas leur demander d'utiliser une bibliothèque C++, mais plutôt écrire un langage propriétaire (éventuellement graphique) taillé sur mesure pour l'application en question.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

Discussions similaires

  1. Parcours d'une structure (Type)
    Par rouls dans le forum VB 6 et antérieur
    Réponses: 0
    Dernier message: 27/04/2012, 11h28
  2. Test en parcourant une structure chainée...
    Par z980x dans le forum C++
    Réponses: 4
    Dernier message: 28/03/2006, 13h45
  3. Comment mettre en place une structure 3 tiers.
    Par WOLO Laurent dans le forum Débats sur le développement - Le Best Of
    Réponses: 13
    Dernier message: 27/07/2003, 22h01
  4. [toFAQ][socket] Envoi d'une structure
    Par julien20vt dans le forum C++
    Réponses: 15
    Dernier message: 23/04/2003, 15h47
  5. longueur d'une structure
    Par bohemianvirtual dans le forum C
    Réponses: 6
    Dernier message: 28/05/2002, 18h31

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