Retourner aux forums || Retourner au forum Programmation.c

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

Posté par Obsidian () le 04 décembre 2005
0
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.

> Lire le message (8 commentaires, moyenne: 2,4).  

Cette discussion est archivée, il n'est plus possible de laisser des commentaires.

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

libs11n ?

Posté par cho7 (page perso, ) le 04/12/2005 à 17:39. (lien). É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...)

--
le python, c'est bon
  • [^]Re: libs11n ?

    Posté par Obsidian () le 04/12/2005 à 19:02. (lien). É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 roucarb () le 04/12/2005 à 18:04. (lien). É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 roucarb () le 04/12/2005 à 18:07. (lien). É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 Obsidian () le 04/12/2005 à 18:58. (lien). É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 alveric () le 05/12/2005 à 09:14. (lien). Évalué à 2.

        offsetof() est définie dans la norme du C...

        • [^]Re: Guerre des endians

          Posté par Obsidian () le 05/12/2005 à 11:55. (lien). É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 David Decotigny (page perso, ) le 05/12/2005 à 09:39. (lien). Évalué à 1.

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

--
d2

Revenir en haut de page || Retourner aux forums || Retourner au forum Programmation.c