Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 6 sur 6
  1. #1
    Invité de passage
    Homme Profil pro Arkadi
    Inscrit en
    juin 2012
    Messages
    1
    Détails du profil
    Informations personnelles :
    Nom : Homme Arkadi

    Informations forums :
    Inscription : juin 2012
    Messages : 1
    Points : 0
    Points
    0

    Par défaut Imprimer le nom de fonction passée en paramètre

    Bonsoir à tous

    Débutant en programmation système et 'C', j'ai un petit problème:

    comment faire pour récupérer/afficher le nom de fonction passée en paramètre.

    J'ai une fonction

    Code :
    1
    2
    3
    4
    5
    fonction1 ( void (*nom_fonction_2) (void) ){
     
    /* bla bla bla*/
    /* le code qui fait son travail*/
    }
    Maintenant je ne sais pas comment afficher sur l'écran via printf() ou un autre appel le nom de fonction 'nom_fonction_2'. Tous ce que j'ai essayé ne marche pas.

    Si qqn peut m'aider...svp
    En vous remerciant par avance ...

  2. #2
    Membre Expert
    Avatar de gerald3d
    Homme Profil pro Gérald
    Conducteur de train
    Inscrit en
    février 2008
    Messages
    1 512
    Détails du profil
    Informations personnelles :
    Nom : Homme Gérald
    Âge : 44
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : février 2008
    Messages : 1 512
    Points : 2 397
    Points
    2 397

    Par défaut

    Bonjour.

    Je ne connais pas la programmation système et ne sais donc pas si il est possible de le faire simplement. Cependant la façon la plus simple à mes yeux pour le réaliser serait de disposer de l'information directement depuis la fonction passée en paramètre.
    On pourrait par exemple avoir une fonction transmise du type :
    Code :
    void callback (char **name);
    name contiendrait alors le nom de la fonction en retour.

    Une autre manière pourrait être d'avoir un tableau qui contiendrait les pointeurs des différentes fonctions ainsi que leur nom respectif. Dans fonction1(); il ne te resterait plus qu'à trouver la correspondance du pointeur de la fonction transmise dans le tableau.
    Système d'exploitation : Debian Amd64 Testing

    Site perso : http://gerald3d.developpez.com (article Glade3 et Gtk+)

    Site perso : http://linechec.sourceforge.net (jeu d'echec) v0.4-1
    Site perso : http://m3dlib.tuxfamily.org/ (moteur 3d. Rendu dans un GtkDrawingArea avec utilisation de Cairo.) v0.26

    contact jabber : gerald3d@jabber.tuxfamily.org

  3. #3
    Modérateur
    Avatar de gangsoleil
    Profil pro
    R&D en systemes informatiques bas niveau Unix/Linux
    Inscrit en
    mai 2004
    Messages
    8 473
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : R&D en systemes informatiques bas niveau Unix/Linux

    Informations forums :
    Inscription : mai 2004
    Messages : 8 473
    Points : 21 554
    Points
    21 554

    Par défaut

    Citation Envoyé par aral510 Voir le message
    comment faire pour récupérer/afficher le nom de fonction passée en paramètre.

    Code :
    1
    2
    3
    4
    5
    fonction1 ( void (*nom_fonction_2) (void) ){
     
    /* bla bla bla*/
    /* le code qui fait son travail*/
    }
    C'est une callback ? Comment est initialise le pointeur ? Est-ce que vous utilisez des libs dynamiques (appel a dlopen par exemple) ?
    Modérateur "C", "Informatique Générale & Hardware" et "Unix"
    Les règles du forum

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    septembre 2007
    Messages
    5 366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2007
    Messages : 5 366
    Points : 12 538
    Points
    12 538

    Par défaut

    Hello,

    Citation Envoyé par aral510 Voir le message
    comment faire pour récupérer/afficher le nom de fonction passée en paramètre.

    Code :
    1
    2
    3
    4
    5
    fonction1 ( void (*nom_fonction_2) (void) ){
     
    /* bla bla bla*/
    /* le code qui fait son travail*/
    }
    Maintenant je ne sais pas comment afficher sur l'écran via printf() ou un autre appel le nom de fonction 'nom_fonction_2'. Tous ce que j'ai essayé ne marche pas.
    Ce n'est pas possible en soi parce que tous les noms de symboles sont résolus à la compilation en leur adresse en mémoire et disparaissent complètement de l'exécutable s'ils ne sont pas nécessaires. Lorsque ta fonction sera appelé par le reste du programme, la seule chose que tu recevras en paramètre sera le point d'entrée en mémoire de la fonction concernée. Donc un pointeur.

    Toutefois, il faut signaler deux exceptions :

    • Le cas des bibliothèques dynamiques chargées à l'exécution avec dlopen() comme souligné par Gangsoleil ;
    • Le fait que si tu connais à l'avance les fonctions qui sont susceptibles de t'être transmises, alors tu peux dresser un tableau local dans ta routine qui contienne à la fois le pointeur vers ladite fonction et son nom en toutes lettres. Tu peux écrire une macro #define pour générer une expression qui spécifie les deux en même temps à partir d'un unique paramètre, mais cela t'oblige quand même à saisir la liste à l'avance. À l'exécution, tu parcours ton tableau pour voir si un pointeur égal à celui reçu s'y trouve.


    À noter enfin que si tu cherches à faire cela à des fins de déboguage, alors il vaut mieux directement apprendre à se servir du débogueur (gdb). Pour cela, compile ton programme avec l'option « -g » et exécute-le ensuite depuis gdb. Ton programme sera toujours compilé de la même façon mais l'exécutable sera accompagné d'une section supplémentaire contenant la table de tous les symboles.

    Ainsi, non seulement le compilateur sera à même de résoudre ces pointeurs en le nom de la fonction correspondante, mais également de t'afficher le code source au fur et à mesure de son exécution.

  5. #5
    Modérateur
    Avatar de gangsoleil
    Profil pro
    R&D en systemes informatiques bas niveau Unix/Linux
    Inscrit en
    mai 2004
    Messages
    8 473
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : R&D en systemes informatiques bas niveau Unix/Linux

    Informations forums :
    Inscription : mai 2004
    Messages : 8 473
    Points : 21 554
    Points
    21 554

    Par défaut

    Bonjour,

    Ce que je trouve bizarre, c'est que tu sois debutant et que tu cherches a jouer avec des pointeurs de fonctions, qui sont des concepts relativement complexes a apprehender...
    Modérateur "C", "Informatique Générale & Hardware" et "Unix"
    Les règles du forum

  6. #6
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    octobre 2008
    Messages
    1 514
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

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

    Informations forums :
    Inscription : octobre 2008
    Messages : 1 514
    Points : 2 235
    Points
    2 235

    Par défaut

    Au lieu d'appeler ta fonction directement tu pourrais passer par un macro qui appellerait ta fonction (fonction1) en lui passant le nom de la fontion ("fonction2") et son adresse.

    Evidemment il faut que tu modifie fonction1 pour qu'elle prenne un nom de fonction et son adresse en argument.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •