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 :

Définir des fonctions static dans un fichier séparé.


Sujet :

C

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    613
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 613
    Points : 406
    Points
    406
    Par défaut Définir des fonctions static dans un fichier séparé.
    Bonjour,

    J'ai besoin d'écrire des fonctions de callback, et comme il y en a beaucoup, pour plus de clarté, j'aimerais les écrire dans un fichier séparé.
    Mais ce sont des fonctions "static".
    Comment faire ?

    merci

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Pour quelle raison elles sont "static"

    En général, en C, quand on rend une fonction static, c'est pour la rendre non visible d'un autre module C

    que ces fonctions soient des callback ne devrait avoir aucun impact sur leur visibilité static ou non

  3. #3
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Elles sont statiques car on veut avoir des fonctions de même nom dans des fichiers sources différents. Mais je n'ai rien compris à la question, si une fonction fait référence à une fonction callback (statique), les deux doivent simplement se trouver dans le même fichier source ...

  4. #4
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    On peut aussi imaginer une autre solution :

    tu mets tes fonctions de callback dans un module à part et tu les rends statiques.

    Dans ce même module, tu ajoutes une fonction non statique qui te retourne un tableau de pointeurs de fonction sur tes fonction callback. Cela suppose que tes fonctions callback on toute le même prototype.

    Dans le cas contraire (pas le même prototype), tu retournes une structure de pointeurs de fonction.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    613
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 613
    Points : 406
    Points
    406
    Par défaut
    Citation Envoyé par Melem Voir le message
    Elles sont statiques car on veut avoir des fonctions de même nom dans des fichiers sources différents. Mais je n'ai rien compris à la question, si une fonction fait référence à une fonction callback (statique), les deux doivent simplement se trouver dans le même fichier source ...
    Elles sont statics car elles ne sont utilisées nulle part ailleurs. Et je voulais separer les fichiers pour plus de clarté car il y en a beaucoup.

    Citation Envoyé par ram-0000 Voir le message
    tu mets tes fonctions de callback dans un module à part et tu les rends statiques.

    Dans ce même module, tu ajoutes une fonction non statique qui te retourne un tableau de pointeurs de fonction sur tes fonction callback. Cela suppose que tes fonctions callback on toute le même prototype.

    Dans le cas contraire (pas le même prototype), tu retournes une structure de pointeurs de fonction.
    Comme le but était de de simplifier la chose, malheueresement cette solution est un peu compliquée

    Sinon je peux peut etre ecrire les fonctions en question dans un .h et l'inclure seulement là ou je m'en sert ?
    mais c'est peut etre pas conseillé de faire comme ca ?

  6. #6
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Définir quelquechose dans un .h, c'est mal

    On définit dans un .c et on déclare dans le .h (si besoin est)

  7. #7
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    En reprenant l'idée de Ram :
    interface.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    typedef struct {
       void (*fonction_1)();
       void (*fonction_2)();
       void (*fonction_3)();
    } stInterface;
     
    void InitialiserInterface(stInterface*pItf_);
    interface.c
    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
     
    #include "interface.h"
     
    static void ma_fonction_1();
    static void ma_fonction_2();
    static void ma_fonction_3();
     
    void InitialiserInterface(stInterface*pItf_)
    {
       pItf_->fonction_1 = ma_fonction_1;
       pItf_->fonction_2 = ma_fonction_2;
       pItf_->fonction_3 = ma_fonction_3;
    }
     
    static void ma_fonction_1()
    {
       /* traitement */
    }
     
    static void ma_fonction_2()
    {
       /* traitement */
    }
     
    static void ma_fonction_3()
    {
       /* traitement */
    }
    Exemple d'utilisation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    int main(){
    stInterface mon_interface;
       InitialiserInterface(&mon_interface);
       mon_interface.fonction_1();
       mon_interface.fonction_2();
       mon_interface.fonction_3();
    	return 0;
     
    }

  8. #8
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Points : 2 505
    Points
    2 505
    Par défaut
    Tu peux tout à fait, via un pointeur de fonction, appeler une fonction qui est définie "static" dans une autre fichier source. Le fait que la fonction soit "static" ne change rien.

  9. #9
    Expert éminent sénior

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 916
    Points
    17 916
    Billets dans le blog
    2
    Par défaut
    Absolument..

    Mais je pense que de toutes façons le problème de départ n'étant pas clair, au vu du niveau, je ne pense pas qu'il faille en arriver là..

    Je pense que le PO a tout simplement un problème de conception... Qu'il doit fouiller et nous expliquer plus clairement

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    613
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 613
    Points : 406
    Points
    406
    Par défaut
    Pour préciser le problème :
    J'utilise la libraire C sqlite3 pour faire des requêtes SQL.
    Et dans un fichier j'ai des fonctions qui font la liaison entre mon application et sqlite.

    Ex : Imaginons une base de données avec des utilisateurs, j'ai alors une fonction qui s'appelle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int getIdUtilisateur(const char *nom)
    {
         [...]
         sqlite3_exec(... , callback1, ...);
         [...]
    }
    Dans une fichier requetes_base.c

    Et j'ai plusieurs dizaine de fonctions comme ça.

    Le problème c'est que pour chaque fonction, il y a une requête SQL différente, et donc un callback différent pour chaque requête.

    Pour faciliter la lecture et la modification de ce fichier je voulais mettre les callbacks dans un fichier à part, car une fois écrit ils changent rarement.

  11. #11
    Expert éminent sénior

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 916
    Points
    17 916
    Billets dans le blog
    2
    Par défaut
    alors la meilleure solution est du style présentée ci-dessus..

    Pour faire quelque chose de vraiment propre, quelque chose dans le style irait bien :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    typedef int Ma_Proc(void *client, void *cbstruct);
     
    typedef struct pMa_Fct {
     
          int       functiontype ;
          Ma_Proc   *adr ;
          void      *data ;
     
    } Ma_Fct ;
    Suivi d'un module de gestion de ces fonctions (dont voici un exemple de .h) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    extern int     RegisterFunction         ( int functiontype,
                                              Ma_Proc Adr, void *data );
     
    extern Boolean CheckIfRegisteredFunction( int functiontype );
     
    extern int     CallRegisteredFunction   ( int functiontype,
      			                  void *FctStruct);
     
    extern int     RemoveRegisteredFunction ( int functiontype, 
                                              MCore_Proc Adr, void *data );
    Puis tu l'utilises en ayant dans ton module principal un "Init_Callbacks (qui serait déclaré en externe dans ton Callbacks.h)

    Puis dans ton callbacks.c, tu as tes callbacks statiques, puis la fonction Init_Callbacks, du style

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    static int MaPremiereCallback ( void *cdata, void *cstruct)
    {
       MonData *LocalData = (MonData *) cdata ;
     
       ....
    }
     
    int Init_Callbacks ( struct MonData *MesData )
    {
       int i, ss=0 ;
     
       i = RegisterFunction (MAPREMIEREREQUETE_ID, MaPremiereCallback, (void *)MesData);
       .......
    }
    et dans tes modules extérieurs (style ton main) :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
           if ( CheckIfRegisteredFunction( MAPREMIEREREQUETE_ID ))
            {
    	  k = CallRegisteredFunction ( MAPREMIEREREQUETE_ID, (void *)&MonDataLocal );
            }
    Bien sûr, il te faudra définir toutes tes requêtes ou types de callbacks possibles dans un .h (les #define MAPREMIREREQUETE_ID)


  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    613
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 613
    Points : 406
    Points
    406
    Par défaut
    ok, merci à tous pour les infos.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 14/02/2011, 19h30
  2. Réponses: 0
    Dernier message: 20/09/2010, 15h25
  3. Peut-on définir des fonctions dans un script ?
    Par nchristedem dans le forum MATLAB
    Réponses: 20
    Dernier message: 11/08/2009, 11h38
  4. Utiliser des fonctions contenues dans un fichier .bas
    Par usbeck dans le forum Visual C++
    Réponses: 4
    Dernier message: 11/08/2006, 12h03
  5. Réponses: 6
    Dernier message: 22/05/2006, 13h54

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