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 :

Du code réutilisable ?


Sujet :

C

  1. #1
    Membre éclairé Avatar de tintin72
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    663
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 663
    Par défaut Du code réutilisable ?
    Bonjour,

    J'essaie de coder une liste chainée de façon à ce qu'elle soit le plus réutilisable possible.
    Dans mon code je définit le type de données à manipuler dans le header:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    typedef int TYPE; //ici par exemple le type de données à manipuler est int.
    Le pb c'est que, écrit comme ça, mon code ne traitera que des listes qui manipuleront des int.
    Aussi, j'aimerais savoir si il était possible (via une fonction ou un typedef particulier) de définir 2 listes (faisant appel au même code) mais qui manipuleraient chacune une donnée de type différent sans avoir a réécrire 2 fois le code.
    En C++ c'est possible avec les templates, y a t-il une équivalence en C ?

    Merci

  2. #2
    Membre Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Par défaut
    Citation Envoyé par tintin72
    En C++ c'est possible avec les templates, y a t-il une équivalence en C ?
    Non. Le seul moyen d'ecrire du code generique est de manipuler des pointeurs void (void *).

  3. #3
    Membre éclairé Avatar de tintin72
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    663
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 663
    Par défaut
    Non. Le seul moyen d'ecrire du code generique est de manipuler des pointeurs void (void *).
    Merci mais est ce que tu pourrais me donner un exemple concret ?

  4. #4
    Membre chevronné
    Avatar de joellel
    Profil pro
    Inscrit en
    Février 2003
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Février 2003
    Messages : 234

  5. #5
    Expert confirmé
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Par défaut
    Non. Le seul moyen d'ecrire du code generique est de manipuler des pointeurs void (void *).
    C'est aussi possible en utilisant des macros.

  6. #6
    Membre éclairé Avatar de tintin72
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    663
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 663
    Par défaut
    C'est aussi possible en utilisant des macros.
    Pourrais tu me dire comment faire, ou bien me donner un liens sur un exemple ou un tuto ,

    Merci

  7. #7
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par tintin72
    Pourrais tu me dire comment faire, ou bien me donner un liens sur un exemple ou un tuto ,
    T'as la flemme de le faire toi même ou quoi ? il faut qu'on te file tout tout cuit ? T'as pas de cerveau ? Fait trop chaud, il a fondu ?

    Si tu cherches à vraiment apprendre, le mieux est de nous présenter tes essais. Maintenant si tu veux ne veux rien apprendre mais juste pomper, continue comme ça...

  8. #8
    Membre éclairé Avatar de tintin72
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    663
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 663
    Par défaut
    T'as la flemme de le faire toi même ou quoi ? il faut qu'on te file tout tout cuit ? T'as pas de cerveau ? Fait trop chaud, il a fondu ?
    Maintenant si tu veux ne veux rien apprendre mais juste pomper, continue comme ça...
    On peut trés bien apprendre en regardant un exemple puis en l'analysant!
    Qui te dis que je vais faire un copier/coller tout bête ?
    Tu as tout découvert par toi même toi ?
    Si oui alors Bravo!! tu es un petit génie, je me demande ce que tu fais sur ce forum.
    Excuse moi encore d'avoir sollicité ton incommensurable savoir.

  9. #9
    Membre chevronné
    Avatar de joellel
    Profil pro
    Inscrit en
    Février 2003
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Février 2003
    Messages : 234
    Par défaut
    Tu exagères un peu! Emmanuel a raison en te suggérant d'utiliser Google ou tout autre moteur de recherche pour trouver les infos par toi même.
    Celle que je t'ai donnée tout à l'heure, comment crois tu que je l'ai trouvée?D'autant plus qu'on tombe toujours sur des infos intéressantes lors de ce type de recherches

  10. #10
    Membre éclairé Avatar de tintin72
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    663
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 663
    Par défaut
    Tu exagères un peu! Emmanuel a raison en te suggérant d'utiliser Google ou tout autre moteur de recherche
    Je l'ai déjà fait figure toi mais je n'ai pas trouvé suffisament d'infos.
    De plus ne suis pas un pro du C, et la généricité en C n'est pas vraiment un truc facile à saisir.
    Aussi, je ne trouve pas que demander un lien soit une marque de flemmardise
    éhontée.

  11. #11
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par tintin72
    De plus ne suis pas un pro du C, et la généricité en C n'est pas vraiment un truc facile à saisir.
    Aussi, je ne trouve pas que demander un lien soit une marque de flemmardise
    éhontée.
    Comme jusque là, tu as montré 1 ligne de code, on a des doutes...

    http://emmanuel-delahaye.developpez.com/tad.htm
    http://emmanuel-delahaye.developpez.com/complog.htm

  12. #12
    Membre chevronné
    Avatar de joellel
    Profil pro
    Inscrit en
    Février 2003
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Février 2003
    Messages : 234
    Par défaut
    Bon, je m'énerve
    Google vient de me trouver un super tutoriel sur les listes (que je vais garder, d'ailleurs ): http://ilay.org/yann/articles/genericite/

    plus un bon cours de C: http://www-id.imag.fr/~svarrett/down...TML/index.html

    plus un cours sur les structures de données avec exemple de macros
    http://www-lipn.univ-paris13.fr/~bou...iemePartie.pdf
    Je m'arrête là car j'ai mieux à faire

  13. #13
    Membre éclairé Avatar de tintin72
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    663
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 663
    Par défaut
    Bon, je m'énerve
    Restes calme je l'avais déjà trouvé aussi, mais bon y a encore des trucs qu'il faut que je saisisse.

    Comme jusque là, tu as montré 1 ligne de code, on a des doutes...
    Ok, bon alors voilà le code actuel de ma liste chainée. Je n'ai que le header (les fonctions ne sont pas encore implémentées).
    En fait je me suis inspiré d'un (trés bon) exemple de liste en C++, et j'aimerais bien retranscrire ces même fonctionnalité en C (+ la généricité).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
     
    #ifndef _LINKEDLIST_H_
    #define _LINKEDLIST_H_
    #include <stdio.h>
    #include <stdlib.h>
     
     
    typedef unsigned int UINT;
    typedef void* PVOID; //définit un pointeur générique
     
     
    typedef struct{
     
        PVOID data;
        struct ELEMENT *next;//pointe sur l'élément suivant
        struct ELEMENT *prev;//pointe sur l'élément précédent
     
    } ELEMENT;
     
    typedef ELEMENT*  PELEMENT; //définit un pointeur sur une structure ELEMENT
     
    typedef struct{
     
       PELEMENT head; //pointe sur le 1er élément
       PELEMENT tail;   //pointe sur le dernier élément
       PELEMENT curr; //pointe sur l'élément courant
       UINT nbElem;  //nombre d'éléments dans la liste
     
    } LIST;
     
     
       //MÉTHODES DE MODIFICATION
    int addBeg(const PVOID *val, bool mdf); //ajoute ou modifie un (l')élément en début de liste
    int addBeg();//ajoute un élément vide en début de liste (surcharge)
    int addEnd(const PVOID *val, bool mdf); //ajoute ou modifie un (l')élément en fin de liste
    int addEnd();//ajoute un élément vide en fin de liste (surcharge)
    int addPos(const PVOID *val, UINT pos, bool mdf);//ajoute ou modifie un (l')élément à la position donnée
    int addPos(UINT pos);//ajoute un élément vide à la position donnée (surcharge)
     
    void removeBeg(); //retire le 1er élément de la liste
    void removeEnd(); //retire le dernier élément de la liste
    void removePos(UINT pos); //retire l'élément à la position donnée
    void empty();  // vide la liste.
     
           //GESTION DE L'ELEMENT COURANT
     
    void setCurrBeg(); //le 1er élément est l'élément courant
    void setCurrEnd(); //le dernier élément est l'élément courant
    void setCurrPos(UINT pos);//définit l'élément courant à la position donnée
    void incrCurr();//incrémente l'élément courant de 1 élément vers la fin de la liste
    void decrCurr();//décrémente l'élément courant de 1 élément vers le début de la liste
    void setCurr(const TYPE *val); //modifie l'élément courant
     
           //MÉTHODES DE CONSULTATION
     
    PVOID consultBeg() const; //retourne la valeur du 1er élément de la liste
    PVOID consultEnd() const; //retourne la valeur du dernier élément de la liste
    PVOID consultPos(UINT pos) const; //retourne la valeur de l'élément à la position donnée
    PVOID consultCurr() const; //retourne la valeur de l'élément courant
    int isEmpty() const {return nbElem == 0;} //Retourne 1 si la liste est vide, sinon zéro.
    int size() const {return nbElem;}//Retourne le nombre d'éléments présents dans la liste
     
    #endif /*_LINKEDLIST_H_*/

  14. #14
    Membre expérimenté Avatar de Pikwik
    Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2006
    Messages : 237
    Par défaut
    Hum,

    Pourquoi tu te compliques la vie ? Tu fais ta liste qui prend en donnèes un pointeur void. Après quand tu utilises ta liste (que ce soit une fois ou 40 fois) tu fabriques une structure pour chauq'une de tes listes, et tu fais pointer ton pointeur de donnèes vers des instances(instance est bien le bon mot ?) de cette strcture.

    J'utilise toujours les même fichiers .h et .c pour mes listes, et après je fabrique un "manager" qui contient ma structure et toute les fonctions utiles pour ajouter supprimer, qui utilise les fonction de ma liste. Les fonctions du manager sont très rapide à écrire, ca prend 15 minutes en fonction de la complexcité.

    Donc si j'ai 4 listes différentes j'ai 1 seul type de liste et 4 managers différents...

    J'espère ne m'être pas trop mal exprimé...

  15. #15
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Par défaut
    Citation Envoyé par PRomu@ld
    C'est aussi possible en utilisant des macros.
    Je serais quand même curieux de connaitre la méthode pour faire ça avec des macro. Tu simule la surcharge de fonctions grâce à sizeof ?

  16. #16
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Par défaut
    Citation Envoyé par gege2061
    Je serais quand même curieux de connaitre la méthode pour faire ça avec des macro. Tu simule la surcharge de fonctions grâce à sizeof ?

    ça dépend comment la liste est utilisée dans le programme après, mais on peut utiliser (personnellement, je le ferai pas) des #ifdef MACHIN avec à chaque fois des: typedef le_type Element;

    Lors de la compilation, il suffit d'ajouter -DMACHIN pour avoir le bon type au bon moment. Mais le problème c'est qu'une fois compilé, la liste n'est utilisable qu'avec un seul type !

  17. #17
    Membre éclairé Avatar de tintin72
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    663
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 663
    Par défaut
    gege2061 a écrit :
    Je serais quand même curieux de connaitre la méthode pour faire ça avec des macro. Tu simule la surcharge de fonctions grâce à sizeof ?
    http://www.exood4.com/tutorials/arti..._1.php?lang=fr

    mais 'faut bien connaitre les macros
    pour l'instant j'ai pas encore tout compris.

  18. #18
    Expert confirmé
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Par défaut
    Je serais quand même curieux de connaitre la méthode pour faire ça avec des macro.
    C'est presque de cette manière que j'avais eu l'occasion de faire. C'était un sujet de TP, si j'ai l'occasion de remettre la main dessus je te l'enverrai.

  19. #19
    Membre confirmé Avatar de _kal_
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2006
    Messages
    178
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2006
    Messages : 178
    Par défaut
    Voici un exemple d'une pile générique. Apres il suffit d'adapter ce modèle aux listes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    #ifndef PILE_H
    #define PILE_H
     
    #define PILE_IMPLEMENTATION(type, taille) \
        {\
            type base [taille];\
            type *prochain;\
        }
     
    #define PILE_DECLARER(type, ident, taille) \
        struct PILE_IMPLEMENTATION(type, taille) ident
     
    #define PILE_DEFTYPE(type, ident, taille) \
        struct ident PILE_IMPLEMENTATION(type, taille);\
        typedef struct ident ident
     
    #define PILE_TAILLE(ident)  \
        (sizeof(ident).base/sizeof(ident).base[0])
     
    #define PILE_LIMITE(ident) \
        ((ident).base + PILE_TAILLE((ident)))
     
    #define PILE_INIT(ident) \
        (ident).prochain = ((ident).base)
     
    #define EMPILER(ident,e)     (*(ident).prochain++ = (e))
    #define DEPILER(ident)       (*--(ident).prochain)
     
    #define PILE_VIDE(ident) \
        ((ident).prochain == (ident).base)
    #define PILE_PLEINE(ident) \
        ((ident).prochain >= PILE_LIMITE(ident))
     
    #define PILE_SOMMET(ident) (*((ident).prochain-1))
     
    #endif  /* PILE_H */
    Voilà, si ça peut aider

    Ce code est issue du livre "Méthodologie de la Programmation en C".

  20. #20
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par _kal_
    Voici un exemple d'une pile générique. Apres il suffit d'adapter ce modèle aux listes
    <...>
    Voilà, si ça peut aider
    Bien garder en tête que ident ne doit pas être un pointeur (ou alors déréférencé : *p, voire multiplié par une nombre d'éléments : *p * n, enfin, ça dépend des cas, bref, c'est pas évident). Je préfère la méthode du void *...

Discussions similaires

  1. Bestpractice, code réutilisation (DRY)
    Par webkoros dans le forum AngularJS
    Réponses: 4
    Dernier message: 18/06/2014, 14h06
  2. Réponses: 0
    Dernier message: 09/11/2010, 15h28
  3. Réponses: 2
    Dernier message: 13/09/2009, 15h01
  4. Rendre le code réutilisable en Assembleur
    Par ToutEnMasm dans le forum x86 32-bits / 64-bits
    Réponses: 3
    Dernier message: 22/06/2009, 10h25
  5. [Juridique] Comment réutiliser le code source d'une classe ?
    Par mathieu dans le forum Général Java
    Réponses: 8
    Dernier message: 17/05/2004, 13h40

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