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 :

Comparateur de structures dont le type n'est pas connu


Sujet :

C

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 128
    Points : 70
    Points
    70
    Par défaut Comparateur de structures dont le type n'est pas connu
    Bonjour,

    J'ai une problème liée au développement d'un de mes programmes. J'aimerais que vous me donniez votre avis/idées.

    Soit deux occurrences d'une structure dont le type n'est pas connu(donc on ne connait pas le nom des champs).
    J'aimerais créer un comparateur entre deux structures. Celui-ci pourrait donc comparer les deux occurrences décrites plus haut.
    Ce comparateur doit comparer chaque champ des deux structures avec un opérateur de comparaison différents à chaque fois.
    On aurait donc par ex :
    struct1 : {int_a, string_s}
    struct2 : {int_b, string_t}
    Le comparateur : compareStruct(struct1, struct2, {">=", "!="})
    Le retour de ce comparateur est : vraie si la comparaison est vraie pour chaque sous-comparaison ou false dans le cas contraire.

    Écris ainsi, il n'est pas possible de résoudre le problème. En effet, n'ayant pas le type de la structure, "on ne sait pas" accéder aux champs.
    Je rajoute donc une info : On connait les valeurs de chaque champs de la deuxième structure. Chaque valeur est pointé par un pointeur de type void*. Attention, je précise : On connait les valeurs des champs et non les noms/les types des champs.

    Auriez-vous une idée pour résoudre le problème ?
    Je n'ai pas encore réussi à trouver.

    Bien à vous.

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

    Citation Envoyé par zizoufoot Voir le message
    Je rajoute donc une info : On connait les valeurs de chaque champs de la deuxième structure. Chaque valeur est pointé par un pointeur de type void*. Attention, je précise : On connait les valeurs des champs et non les noms/les types des champs.
    Si tu sais que l'un d'eux est le premier élément de la structure, tu peux essayer une chose vraiment très sale : la norme te garantit que l'adresse du premier élément de ta structure est celle de la structure elle-même. De là, tu peux transtyper tes pointeurs en « char * » pour bénéficier de l'arithmétique des pointeurs et obtenir leur différence. Ça te permettra de déduire deux nouveaux pointeurs à partir de l'adresse de l'autre structure. Ton problème sera cependant loin d'être réglé car puisque tu ne sais pas ce que tu pointes (« void * »), tu ne peux pas comparer ces deux éléments entre eux.

    Si tu en es là, il y a de fortes chances que ton problème se situe en amont et que tu te sois engagé dans une impasse. Donne-nous les détails de ton projet et dis-nous exactement ce que tu cherches à faire, on tâchera de t'orienter vers la solution la plus adaptée.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 128
    Points : 70
    Points
    70
    Par défaut
    Merci pour ton aimable réponse.

    C'est un peu plus "chiant" que ça. Fort malheureusement, les valeurs dans les champs ne sont que des copies des originales. Ainsi, je ne peux "remonter" dans la structure.
    Il s'agit, après réflexion, d'un cul de sac.
    Ca m'ennuie fortement car le programme m'est limité en amont(on m'a imposé une interface avec laquelle travailler).
    Je vais encore y réfléchir et voir si il n'y a pas une faille en amont me permettant de connaître la structure de travail.

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 368
    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 368
    Points : 23 620
    Points
    23 620
    Par défaut
    Citation Envoyé par zizoufoot Voir le message
    Je vais encore y réfléchir et voir si il n'y a pas une faille en amont me permettant de connaître la structure de travail.
    C'est pas une faille qu'il faut chercher. C'est l'erreur de conception au départ. Il y a de fortes chances qu'il te faille procéder complètement différemment à la base, et de façon beaucoup plus simple.

  5. #5
    Membre éprouvé
    Avatar de Celelibi
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 087
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 087
    Points : 1 122
    Points
    1 122
    Par défaut
    La question que je me pose c'est : pourquoi tu veux faire ça ?

    Soit ce n'est pas vraiment des structures que tu veux comparer, parce que les structures sont connus à l'avance et ont un nombre de champ fini et connu.

    Soit tu veux en fait éviter de faire de la copie de code parce que ta comparaison de structures est très similaire d'une structure à l'autre. Et dans ce cas, c'est de la génération de code que tu veux faire. Et ça, ça se fait soit avec le préprocesseur mais c'est vite sale, soit avec un outil externe à rajouter à la toolchain.
    Les vaches ne peuvent PAS voler, quoi qu'elles aient pu vous raconter.

  6. #6
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 149
    Points : 28 116
    Points
    28 116
    Par défaut
    Citation Envoyé par zizoufoot Voir le message
    Je rajoute donc une info : On connait les valeurs de chaque champs de la deuxième structure. Chaque valeur est pointé par un pointeur de type void*. Attention, je précise : On connait les valeurs des champs et non les noms/les types des champs.

    Auriez-vous une idée pour résoudre le problème ?
    1.4, c'est quoi pour toi ? Un float, un double, une chaine de caracteres ?
    42 : short, long long int (attention C99), signe ou pas, chaine de caracteres, autre chose ?

    La valeur du champs ne t'indique pas la taille utilisee pour stocker l'information, donc cette information ne sert pas a grand chose.


    Tu dis que la comparaison de deux structures est vraie uniquement si le contenu de chaque champs est identique. Il semble que tu t'attaches beaucoup plus a la valeur des champs qu'a leur type, ce qui est une approche assez casse-gueule si tu as des types non-entiers (puisqu'on ne compare pas deux flottants, on verifie que leur difference est inferieure a une tres petite valeure acceptable).

    Et je rejoins bien evidemment Celelibi sur ses commentaires : savoir ce que tu cherches a faire exactement nous fournirait une aide bien plus precieuse que l'ajout de contraintes qui, dans un cas particulier, aide un peu.
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

Discussions similaires

  1. [Toutes versions] Lire un fichier texte dont l'encoding n'est pas connu
    Par jemore22 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 13/01/2012, 09h28
  2. Réponses: 13
    Dernier message: 24/02/2011, 17h10
  3. Réponses: 12
    Dernier message: 08/11/2010, 19h23
  4. Réponses: 3
    Dernier message: 10/09/2009, 16h24
  5. Réponses: 3
    Dernier message: 23/04/2007, 15h53

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