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 :

polymorphisme paramétrique en C


Sujet :

C

  1. #1
    Membre habitué
    Profil pro
    amateur
    Inscrit en
    Avril 2012
    Messages
    145
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : amateur
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Avril 2012
    Messages : 145
    Points : 144
    Points
    144
    Par défaut polymorphisme paramétrique en C
    Bonjour,

    J'ai un type vrai tableau (de tableau "sûr"), au sens où c'est en fait une struct qui contient le compte d'éléments en plus d'un pointeur vers lesdits éléments. Pour mettre ça au point et étudier les algos nécessaires à toute la gamme de fonctionnalités (dsons les méthodes du type), j'ai fait ça sur des éléments int.
    Maintenant je voudrais savoir s'il est possible de rendre ce type de tableau polymorphique (comme les pointeurs ou les tableaux C natifs)? Si oui, quelles sont les différentes solutions?

    Si c'est possible, alors j'oublie les tableaux C natifs et n'utilise plus que la version sûre ;-) (même si ça impose d'oublier le miel syntaxique d'indexage [i]).
    Si c'est pas possible, alors j'imagine que ça signifie que tous les langages avec types polymorphiques implantés en C font en fait un polymorphisme dit "ad hoc" (avec une union taggée et des switch partout, sans doute). Ce que je vais bientôt devoir faire, d'ailleurs.

    Merci de vos infos et conseils,
    Denis

  2. #2
    Membre expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Points : 3 352
    Points
    3 352
    Par défaut
    Salut,

    tu essayes de faire la même chose que le GArray de la glib et les gvalues de gobject mais en y ajoutant un bound checking ?

  3. #3
    Membre habitué
    Profil pro
    amateur
    Inscrit en
    Avril 2012
    Messages
    145
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : amateur
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Avril 2012
    Messages : 145
    Points : 144
    Points
    144
    Par défaut
    Citation Envoyé par kwariz Voir le message
    tu essayes de faire la même chose que le GArray de la glib et les gvalues de gobject mais en y ajoutant un bound checking ?
    Ah, je connaissais pas. Il va falloir que j'explore cette glib, elle risque de m'épargner bien du travail et/ou me donner des pistes pour ce que je veux faire.

    Alors sinon, c'est tout-à-fait ça sauf que:
    * Pour l'instant, mon type d'Array n'est pas dynamique en taille, c'est la prochaine étape (je sais comment faire, mais je vous demanderai peut-être quelques tuyaux propres au langage C).
    * Oui, toutes le méthodes pour lesquelles c'est pertinent sont bound-checked (mais j'imagine que le garray l'est aussi, non?).
    * Il y a plus de fonctionnalités que celles que je viens de voir dans le descriptif de GArray (ou laors j'ai manqué des infos). Mais pas celles qui concernent un changement de compte d'éléments, bien sûr.

    Je précise ma question: il y a si je pige bien deux points-clés concernant le type des éléments: leur taille mémoire et leur type proprement pour qu('ils soient acceptés par les fonctions qui requièrent ce type.
    J'ai pensé, comme dans la glib apparemment, à définir le type Array de façon à ce qu'il se foute du type d'élément. Le truc, c'est bien sûr d'utiliser void* comme type de pointeur sur les données proprement dites. Il a juste besoin de la taille unitaire, ce qui est pas un problème car l'utilisateur n'a besoin de le donner qu'une fois (et en fait même pas s'il intiialise le tableau avec qq données dès le départ).
    Par contre, le problème reste du type proprement dit: si le type Array ce convertit pas en retour les éléments, alors c'est l'utilisateur qui doit le faire, et ce à chaque accès, ce qui donne un code du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        Type x = *((Type*) (item (array, i))) ;
    où item est une fonction d'indexage (et si je me trompe pas quelque part dans le code). Ce qui est pas bien joli. note: je crois que les fonctions de ce genre ne peuvent retourner q'un pointeur, et pas la donnée proprement dite, si le pointeur n'est pas typé? Je veux dire, il n'y a pas de fonction pour retourner une donnée de n octets no typée?

    Denis

  4. #4
    Membre expérimenté Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Points : 1 396
    Points
    1 396
    Par défaut
    Salut,

    si ça peut t'aider je te joins des codes que j'avais fait. C'est générique (donc void*) et "orienté objet". Mais ça tu peux l'enlever à ta guise.

    On passe les fonctions "utiles" au constructeur. Il faut par contre coder les fonctions pour chaque type.

    EDIT : Je viens de tester et je t'ai mis un exemple, ça marche et il n'y a pas de fuite de mémoire d'après Valgrind.
    Fichiers attachés Fichiers attachés

  5. #5
    Membre habitué
    Profil pro
    amateur
    Inscrit en
    Avril 2012
    Messages
    145
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : amateur
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Avril 2012
    Messages : 145
    Points : 144
    Points
    144
    Par défaut
    Citation Envoyé par Trademark Voir le message
    Salut,

    si ça peut t'aider je te joins des codes que j'avais fait. C'est générique (donc void*) et "orienté objet". Mais ça tu peux l'enlever à ta guise.

    On passe les fonctions "utiles" au constructeur. Il faut par contre coder les fonctions pour chaque type (je t'ai mis "integer.c"). Je n'ai le temps de tester si tout marche mais d'après mes vagues souvenir ça fonctionne plutôt pas mal.
    Merci beaucoup, je vais regarder ça de près dès que j'ai un peu de temps.

    EDIT: Re-merci, je regarde ça cet aprèm.

    Denis

  6. #6
    Membre expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Points : 3 352
    Points
    3 352
    Par défaut
    Re-,

    pour préciser le type, glib définit des macros et l'un des paramètres est le type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    g_array_index()
    #define             g_array_index(a,t,i)
    Returns the element of a GArray at the given index. The return value is cast to the given type.
     
    a : a GArray.
    t : the type of the elements.
    i : the index of the element to return.
     
    Returns :
    the element of the GArray at the index given by i.
    http://developer.gnome.org/glib/2.30...#g-array-index

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

Discussions similaires

  1. Réponses: 13
    Dernier message: 03/09/2009, 22h40
  2. Surcharge et Polymorphisme
    Par Hell dans le forum C++
    Réponses: 6
    Dernier message: 12/01/2005, 21h50
  3. Réponses: 2
    Dernier message: 26/07/2004, 00h24

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