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

Algorithmes et structures de données Discussion :

[Graphes] Mises à plat d'un héritage multiple


Sujet :

Algorithmes et structures de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 296
    Par défaut [Graphes] Mises à plat d'un héritage multiple
    Bonsoir,

    Je suis en train de fignoler un (ft)plugin [1] pour vim [2] pour lequel j'aurais besoin d'ordonner des classes (C++) selon leurs relations d'héritages entre-elles.

    Si on prend les définitions de classes suivantes,
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    struct V {};
    struct Z {};
    struct C1 : virtual V {};
    struct C2 : virtual V, Z {};
    struct C3 : C2{};
    struct D : C1, C3 {};
    en gros je veux pouvoir construire une liste, à plat, de D vers ses ancêtres. Mon but étant de pouvoir parcourir les éléments dans un ordre tel que l'on ne regarde jamais un fils avant un de ses ancêtres.
    P.ex. [C1, C3, C2, V], [C3, C1, C2, V] ou [C3, C2, C1, V] sont valides, mais pas [C1, C3, V, C2] car C2 doit être < V. (j'arrive à construire la dernière forme sans difficulté)

    Tous mes liens, je les obtiens en analysant les résultats de ctags, j'ai ainsi moyen de construire des relations 1 fils -> {parents} et 1 parent -> {n fils}.
    Dans la mesure où je suis capable d'établir un ordre partiel 2 à 2, en propageant la transitivité à la main, je pourrais appliquer des procédures de tri un peu furieusement "complexes". Mais voilà, le résultat ne va vraiment pas être beau.

    Même si au fond je n'aurais jamais plus de 10-20 classes multiplement liées ensembles, je préfèrerai tout de même avoir quelque chose de propre et de moindre complexité.

    Je soupçonne que c'est un problème "classique" et que je ne sois pas le premier à avoir eu ce besoin de mettre à plat et dans un ordre ce genre de graphe orienté et acyclique. Est-ce que quelqu'un aurait une piste en littérature, voire une idée fulgurante?

    Hum ...
    A propos de trucs 2D, j'ai l'impression que si je construis la matrice booléenne des "j'hérite de", me problème semble pouvoir se résoudre par une mise en forme triangulaire supérieure de la matrice ... Je vais creuser, même si je sens que je n'ai absolument pas les bons outils pour faire ce genre de transformations... :-(

    [1] Le but étant de pouvoir proposer à l'utilisateur de choisir les fonctions membre virtuelles héritées qu'il veut redéfinir -- et ce n'est donc absolument pas pour le boulot, ni un devoir à la maison

    [2] Qui dispose d'un langage de script, le VimL, plus ou moins limité. On a enfin les listes et les tables associatives, mais toujours pas de vrais tableaux. (Il faut un peu d'huile de coude pour faire des accès en O(1) sur des tables 2D)
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  2. #2
    Membre émérite Avatar de HanLee
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2004
    Messages : 738
    Par défaut
    Un genre de tri topologique peut-être ?

    Ce que fait l'analyse des dépendances d'un Makefile.

  3. #3
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 296
    Par défaut
    Merci pour ces mots clés. Je vais voir ce que je peux en tirer.
    (Pfff... qu'est-ce qu'il sont vieux mes cours d'algo )
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  4. #4
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Par défaut
    J'ai pas bien cerné le probleme...

    C'est juste une liste à 2 elements (noeud,profondeur) triée sur le 2nd élément.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
         D        ----> depth=0
       __|__
      |     |
     C1     C3    ----> depth=1
      |     |
      |     |
      V     C2    ----> depth=2
          __|__
         |     |
         V     Z  ----> depth=3
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Liste des couples (Node,MaxDepth):
    ---------------------------------
    L = { (D,0) , (C1,1) , (C2,2) , (C3,1) , (V,3) , (Z,3) }
     
     
    Liste Triée par MaxDepth
    ------------------------
    L = { (D,0) , (C1,1) , (C3,1) , (C2,2) , (V,3) , (Z,3) }
     
    Liste Finale:
    -----------
    {D,C1,C3,C2,V,Z}
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  5. #5
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 296
    Par défaut
    Je n'avais pas envisagé le problème sous cette forme (au départ, je n'ai qu'un ensemble de relations (à demander) 1 fils->n parents, et je construis le reste à partir d'un fils donné).

    Effectivement cela a l'air pas mal, seulement il reste une petite subtilité: V peut elle même dériver d'un W. Du coup la mise à jour de la profondeur max de V doit se propager jusqu'à ses enfants, dont W, qui soyons fous, pourrait dériver de Z. Pour l'instant, mon algo de construction évitait de reparcourir un noeud -- l'appel aux fonctions d'obtention des noeuds parent n'est pas instantané, ceci dit, il est simple de de mettre en place une évaluation paresseuse.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  6. #6
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Par défaut
    Citation Envoyé par Luc Hermitte Voir le message
    Effectivement cela a l'air pas mal, seulement il reste une petite subtilité: V peut elle même dériver d'un W. Du coup la mise à jour de la profondeur max de V doit se propager jusqu'à ses enfants,
    C'est géré implicitement par la recherche de la profondeur max.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
       (...)
      |     |
      V     C2    ----> depth=2
      |   __|__
      |  |     |
      W  V     Z  ----> depth=3
         |
         |
         W        ----> depth=4
     
    L = { (...) , (C2,2) , (V,3) , (Z,3), (W,4) }

    dont W, qui soyons fous, pourrait dériver de Z.
    Attention au Diamond of Death.
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

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

Discussions similaires

  1. composants C++ Builder et héritage multiple
    Par vedrfolnir dans le forum C++Builder
    Réponses: 2
    Dernier message: 12/10/2005, 10h04
  2. [heritage][conception]héritage multiple en java!
    Par soulhouf dans le forum Langage
    Réponses: 9
    Dernier message: 25/08/2005, 20h03
  3. L'héritage multiple est-il possible en Delphi ?
    Par SchpatziBreizh dans le forum Langage
    Réponses: 8
    Dernier message: 30/06/2005, 11h30
  4. utilisez vous l'héritage multiple ?
    Par vodosiossbaas dans le forum C++
    Réponses: 8
    Dernier message: 13/06/2005, 20h25
  5. [XML Schemas]héritage multiple
    Par nicolas_jf dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 10/06/2003, 12h55

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