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 :

Nom de fonction dynamique


Sujet :

C

  1. #1
    Membre du Club
    Inscrit en
    Octobre 2009
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 72
    Points : 42
    Points
    42
    Par défaut Nom de fonction dynamique
    Bonjour tout le monde,

    Il se pourrait que le titre vous paraisse bizarre mais, dans d'autres langages (comme PHP), ça existe. Je m'explique : j'ai un ensemble de fonctions qui ont toutes une partie de leurs nom qui est le même pour tous, elles ont les mêmes arguments, etc. La différence entre elles se situe dans la 2ème partie que j'aimerais justement exploiter. Exemple: fct_1, fct_2,... etc. Toutes ces fonctions ont un numéro dans leur nom. J'aimerais exploiter celui-ci pour les appeler dynamiquement depuis une des fonctions en faisant juste une boucle et en mettant le numéro grâce à une variable ou je ne sais quoi.

    Ceci est il possible en C ?

    Je vous remercie.

  2. #2
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Non, le nom d'une fonction n'a plus de rôle au moment de l'exécution.

    La chose qui se rapproche de ce que tu veux est d'utiliser des pointeurs de fonctions placés dans un tableau auquel tu accèdes via un indice. Du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include <stdio.h>
    typedef int (*Tfonc)(int);     // Type pointeur de fonction retournant int et de paramètre int
    int fonc0(int i ){return i+1;} // Une fonction de ce type
    int fonc1(int i){return i-1;}  // Une autre fonction de ce type
    int main(void)
    {
      Tfonc tab[] = {fonc0, fonc1};  // un tableau de ces pointeurs sur fonctions
      int i = 0;
      int val = 5;
      printf("fonc%d(%d) = %d\n", i, val, tab[i](val));  // utilisation de ce tableau de pointeurs
      i = 1;
      printf("fonc%d(%d) = %d\n", i, val, tab[i](val)); 
      return 0;
    }

  3. #3
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 395
    Points : 23 760
    Points
    23 760
    Par défaut
    Bonjour,

    Oui, c'est possible mais pas de la manière dont tu l'imagines. Ceci entre autres parce que le C est un langage compilé et que les noms de symboles disparaissent à la compilation pour être résolus simplement en leur adresse en mémoire (sauf symboles exportés dans le cas des bibliothèques dynamiques).

    Par contre, tu peux utiliser les « pointeurs de fonction » pour faire ce que tu veux faire, et stocker ceux-ci dans un tableau qui, lui, sera indexé par le numéro. Ça t'oblige quand même à rentrer une à une toutes tes fonctions dans ce tableau, mais tu peux malgré tout utiliser une macro pour raccourcir la fonction à saisir. Par exemple :

    Code C : 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
     
     
    #include <stdio.h>
     
    char const * fct_0 (void)
    {
        return "zero";
    }
     
    char const * fct_1 (void)
    {
        return "un";
    }
     
    char const * fct_2 (void)
    {
        return "deux";
    }
     
    char const * fct_3 (void)
    {
        return "trois";
    }
     
    char const * fct_4 (void)
    {
        return "quatre";
    }
     
    int main (void)
    {
        unsigned int i;
        char const * (*tableau[]) (void) = { fct_0, fct_1, fct_2, fct_3, fct_4 };
     
        for (i=0;i<sizeof tableau / sizeof (*tableau);i++)
        printf ("La fonction numéro %u a renvoyé le mot : %s.\n",i,tableau[i]());
     
       return 0;
    }

    (Edit: crosspost).

  4. #4
    Membre du Club
    Inscrit en
    Octobre 2009
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 72
    Points : 42
    Points
    42
    Par défaut
    Merci beaucoup pour vos réponse,

    Donc si j'ai des fonctions, et j'ai des noms de fonction qui se trouve par exemple dans un fichier, et que je voudrai utilisé que les fonctions qui sont dans le fichier, je ne pourrai pas ?
    Si c'est le cas, c'est dommage que le C ne soit pas comme le PHP :'(

  5. #5
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 136
    Points
    23 136
    Par défaut
    Bonjour Mourad,

    Le php est interpreté par un logiciel (peut être écris en C, il faudrait vérifier).
    Je dirais que tu as 3 solutions :
    - inventer ton propre langage interprété selon tes besoins.
    - utiliser un langage interprété déjà connu que tu peux interprété grâce à une librairie (comme LUA si je ne dis pas de bêtises)
    EDIT : http://mdeverdelhan.developpez.com/t...lua/tutoriel1/
    - si tu n'as pas vraiment besoin de fichier mais que tu veux juste insérer plus facilement tes fonctions, tu peux utiliser la solution de diogene : des tableaux de pointeurs de fonctions. Et tu peux même utiliser juste en-dessous un enum pour "nommer" tes différentes fonctions. Tu pourras aussi définir une fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    void (*f)(void * data)[] = {&F1, &F2, &F3}; //je ne suis pas sûr de la syntaxe pour le tableau
    //essaye void (*f[])(void * data) si ça ne marche pas.
    typedef enum{f1, f2, f3}IdFonction;
     
     
    void appel(IdFonction id, void * data)
    {
                (f[id])(data);
    }

Discussions similaires

  1. Nom de fonction "dynamique"
    Par chouetz dans le forum C
    Réponses: 9
    Dernier message: 29/05/2011, 00h53
  2. nom de fonction dynamique
    Par zakuza dans le forum Général JavaScript
    Réponses: 14
    Dernier message: 07/02/2008, 08h56
  3. Réponses: 4
    Dernier message: 18/01/2007, 05h46
  4. Noms de fonctions dynamiques
    Par pierrelm dans le forum Langage
    Réponses: 4
    Dernier message: 28/06/2006, 10h23
  5. Nom de fonction dynamique
    Par gege2061 dans le forum C
    Réponses: 2
    Dernier message: 21/06/2005, 14h44

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