Forum Programmation.c Récupérer les offsets des membres d'une structure.

Posté par  .
Étiquettes : aucune
0
4
déc.
2005
Bonjour,

Je programme en langage C depuis un certain temps, mais pour finaliser un projet actuellement en cours, je cherche à accomplir une chose à laquelle je n'ai pas encore été confronté (en C).

Mon but est « d'externaliser », un peu comme en Java, le contenu des membres d'une structure sous forme texte au travers d'un fichier ou d'un socket. L'objectif est de pouvoir synchroniser ce contenu entre deux structures homologues sur deux machines différentes, ou de permettre leur sauvegarde et leur restauration facilement.

J'aimerais donc savoir s'il y a moyen de connaître à la compilation les offsets (décalages) de chaque membre d'une structure par rapport à son adresse de base. L'idée est de mettre le tout dans un grand tableau, avec une indication du type, et d'écrire une fonction générique qui serait capable de lire le contenu de n'importe quelle structure référencée par un pointeur pour peu qu'on lui transmette également ce tableau.

Je sais que je peux les retrouver de façon « à peu près propre » en utilisant l'arithmétique des pointeurs, mais cela m'oblige à instancier une de ces structures avant de pouvoir les calculer, et implique donc que ces valeurs soient déterminées au runtime et pas à la compilation.

Quelqu'un a-t-il une idée ?
Existerait-il, par hasard, des fonctions toutes faites pour ce genre d'utilisation en langage C ?

Merci d'avance.
  • # libs11n ?

    Posté par  (site web personnel) . Évalué à 4.

    Salut,

    de mémoire pour le c++ il y avait une bibliothèque nommée libs11n qui permettait de faire de la sérialisation (le keyword si tu veux pousser tes recherches, plutot qu'"externaliser"). Reste à savoir si quelqu'un a porté le code, et de voir comment ca se présente (càd est-ce aussi simple qu'en java où un simple writeObject suffit...)
    • [^] # Re: libs11n ?

      Posté par  . Évalué à 2.

      Hello,

      Je vais jeter un coup d'oeil du coté de cette lib.
      Pour la sérialisation, tu as tout-à-fait raison, mais j'avais fait exprès de ne pas employer le terme, car un pro du langage Java m'avais expliqué que la sérialisation se contentait de mettre les données binaires d'un objet bout à bout pour les faire passer dans un canal quelquonque, et que l'externalisation avait en plus pour but de convertir les données de façon à pouvoir les exporter.

      Merci pour le tuyau.
  • # A la bourrin

    Posté par  . Évalué à 3.

    $ cat stddef.h
    [...]
    #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
    [...]

    Pour l'utilisation voir le fichier list.h du kernel et la macro container_of

    Bastien
    • [^] # Re: Guerre des endians

      Posté par  . Évalué à 3.

      J'ai oublié qu'il te faut aussi dans le cas d'une utilisation réseau convertir tous les types en little endian

      Bastien
      • [^] # Re: Guerre des endians

        Posté par  . Évalué à 2.

        Ah ! Une macro #define, ce n'est pas bête du tout ... Bon ce n'est pas encore la panacée mais c'est vrai que cela aide bien.

        Pour l'utilisation réseau, pas de problème, je compte sortir le tout sous forme texte.

        Merci pour ta suggestion.
        • [^] # Re: Guerre des endians

          Posté par  . Évalué à 2.

          offsetof() est définie dans la norme du C...
          • [^] # Re: Guerre des endians

            Posté par  . Évalué à 2.

            *** Génial ! ***

            Merci beaucoup, je n'ai pas trouvé en cherchant au hasard.
            Je me doutais bien qu'elle devait exister.

            A bientôt.
  • # pstruct

    Posté par  (site web personnel) . Évalué à 1.

    Il y a pstruct pour ça. Et swig pour ce qui est des generateurs de wrappers.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.