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 :

Singleton en C ?


Sujet :

C

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    228
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 228
    Par défaut Singleton en C ?
    Etant un habituer du C++ plutôt que de du C. Je me demande si il existe un moyen d'implémenter ce design pattern en C.
    Par une approche typée objet par exemple, en créant des structures assimilées a des objets.

  2. #2
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Citation Envoyé par chronos
    Etant un habituer du C++ plutôt que de du C. Je me demande si il existe un moyen d'implémenter ce design pattern en C.
    Par une approche typée objet par exemple, en créant des structures assimilées a des objets.
    On peut faire quelque chose de similiaire en gardant toute la structure secréte et travaillant avec des fonctions dédiées.

    Pour garder la structure secréte il suffit de la définir dans le .c de ton module et tes fonctions prendront en paramètre un pointeur void*.

    Du coup, de l'extérieur du module, tu auras un pointeur vers ta structure mais aucun moyen de connaître sa taille, ce qu'elle contient, etc...

    Ce qui veut dire qu'on ne peut pas en allouer derrière ton dos et donc on doit passer par ta fonction de création dans laquelle tu peux gérer l'idée du singleton.

    Pas sûr que cela soit très conseillé par contre,
    Jc

  3. #3
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    Salux

    Pas besoin de passer par un void *. Cette technique suffit :
    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
     
    /* .h */
    struct _MonTypeAbstrait;
    typedef struct _MonTypeAbstrait MonTypeAbstrait;
     
    MonTypeAbstrait * mta_create(void);
     
    /*...*/
     
    /* .c */
    struct _MonTypeAbstrait
    {
      int a;
      char * b;
    };
     
    /*...*/

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    228
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 228
    Par défaut .
    J'avais pensé à quelque chose comme la solution de Gruik, effectivement la solution avec du void* ne me plait pas trop

    Au final je vais refaire un semblant d'objet avec du C, merci pour vos réponses

  5. #5
    Membre éclairé Avatar de ronan99999
    Inscrit en
    Juillet 2003
    Messages
    279
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Juillet 2003
    Messages : 279
    Par défaut
    Aprés pour avoir un comportement de type singleton :

    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
     
    /*.c contentant ton destroy et ton create*/
     
    static int iCpt = 0;
     
    int MYCLASS_Create(...)
    {
      if( iCpt == 0)
     {
         //creer
        iCpt++;
     }
      else
       //erreur
      //...
       return //code d'état
    }
     
    int MYCLASS_Destroy(...)
    {
      if( iCpt > 0)
     {
         //detruire
        iCpt--;
     }
      else
       //erreur
      //...
       return //code d'état
    }

  6. #6
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par chronos
    Au final je vais refaire un semblant d'objet avec du C, merci pour vos réponses
    et ça n'a rien de nouveau, c'est extrêmement fréquent en C....


  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    228
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 228
    Par défaut
    Citation Envoyé par souviron34
    et ça n'a rien de nouveau, c'est extrêmement fréquent en C....

    Je note

  8. #8
    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 souviron34
    ça n'a rien de nouveau, c'est extrêmement fréquent en C
    Un bon exemple de cela est le type standard FILE, qui est un type abstrait avec son constructeur fopen() et son destructeur fclose().

  9. #9
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    Encore que je préfère garder le terme "destructeur" pour le C++, RAII oblige : Pour moi, le destructeur est ce qui est supposé être appelé automatiquement à la fin du bloc (dans le cas d'objets locaux), ce qui est impossible en C.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  10. #10
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    oui et de manière générale (pour info au PO) ce qu'on appelle la POO peut être effectuée dans tous les langages, et l'a été d'ailleurs depuis très longtemps dans des langages comme C, Fortran, et même l'assembleur pour tout un tas d'applications.

    La formalisation objet est d'usage relativement récent, mais les concepts sont pratiquement utilisés depuis les débuts de l'informatique : la plupart des gens qui faisaient les programmes étaient des utlisateurs (en science par exemple), et donc manipulaient des "concepts" d'objets : un programme de traitement d'images en Fortran est un programme OO.

  11. #11
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Médinoc
    Encore que je préfère garder le terme "destructeur" pour le C++, RAII oblige : Pour moi, le destructeur est ce qui est supposé être appelé automatiquement à la fin du bloc (dans le cas d'objets locaux), ce qui est impossible en C.
    bah tu peux toujours t'arranger pour le faire, non ?

  12. #12
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    Je ne vois pas trop comment, en tout cas.
    À part en remplaçant les fins de bloc, les break, et les return (sans compter les goto) par des macros, mais dans ce cas cela empêche d'utiliser le } comme fin de bloc...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  13. #13
    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 Médinoc
    Encore que je préfère garder le terme "destructeur" pour le C++
    Oui, j'admet que le vocabulaire que j'ai utilise etait imprecis. Constructeur et destructeur ont des proprietes plus etendues en C++, par exemple. C'etait juste pour faire une simple analogie, sans autre pretention...

  14. #14
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Médinoc
    Je ne vois pas trop comment, en tout cas.
    À part en remplaçant les fins de bloc, les break, et les return (sans compter les goto) par des macros, mais dans ce cas cela empêche d'utiliser le } comme fin de bloc...
    Bah une fonction Destroy_Struct (void *Struct)

    ça peut même être une fonction totalement générale, pour peu que dans Struct tu mettes toujours un type. Et cette fonction fera un switch sur le type pour détruire les champs appropriés...

    Mais peut-être que j'ai pas tout compris à la notion de destructeurs...

  15. #15
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Citation Envoyé par souviron34
    Bah une fonction Destroy_Struct (void *Struct)

    ça peut même être une fonction totalement générale, pour peu que dans Struct tu mettes toujours un type. Et cette fonction fera un switch sur le type pour détruire les champs appropriés...

    Mais peut-être que j'ai pas tout compris à la notion de destructeurs...
    Non le problème est ici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    {
      MonTypeAbstrait a;/* Normalement on voudrait que le constructeur soit appelé ici, impossible de facon transparente en C*/
      /* blabla */
    } /* Normalement on voudrait que le destructeur soit appelé ici, impossible de facon transparente en C*/
    Jc

  16. #16
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    OK dans ce cas oui... je comprends.

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

Discussions similaires

  1. [Servlet]Singleton & cache
    Par lucimast dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 15/12/2004, 16h36
  2. Singleton héritable ?
    Par rolkA dans le forum C++
    Réponses: 10
    Dernier message: 11/12/2004, 16h22
  3. [Débutant] pattern singleton
    Par SirDarken dans le forum Débuter avec Java
    Réponses: 22
    Dernier message: 11/12/2004, 01h55
  4. Mutiple row in singleton select ????? [Important, merci]
    Par SkyDev dans le forum Bases de données
    Réponses: 6
    Dernier message: 20/04/2004, 14h02
  5. [debutant]Singleton
    Par bafman dans le forum Langage SQL
    Réponses: 6
    Dernier message: 13/01/2004, 15h41

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