Précédent   Forum du club des développeurs et IT Pro > Général Développement > Programmation système > Linux
Linux Forum d'entraide sur la programmation Linux : shell, système, ...
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 14/06/2012, 20h26   #1
aral510
Invité de passage
 
Homme Arkadi
Inscription : 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 ...
aral510 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/06/2012, 12h03   #2
gerald3d
Expert Confirmé
 
Avatar de gerald3d
 
Homme Gérald
Conducteur de train
Inscription : février 2008
Messages : 1 368
Détails du profil
Informations personnelles :
Nom : Homme Gérald
Âge : 43
Localisation : France, Côte d'Or (Bourgogne)

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

Informations forums :
Inscription : février 2008
Messages : 1 368
Points : 2 536
Points : 2 536
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 / Slackware 13.37 32 bits

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
gerald3d est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/06/2012, 15h06   #3
gangsoleil
Modérateur
 
Avatar de gangsoleil
 
R&D en systemes informatiques bas niveau Unix/Linux
Inscription : mai 2004
Messages : 7 191
Détails du profil
Informations personnelles :
Âge : 32
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 : 7 191
Points : 18 085
Points : 18 085
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
gangsoleil est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 21/06/2012, 22h41   #4
Obsidian
Modérateur
 
Avatar de Obsidian
 
Homme
Chercheur d'emploi
Inscription : septembre 2007
Messages : 4 614
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 36
Localisation : France, Essonne (Île de France)

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

Informations forums :
Inscription : septembre 2007
Messages : 4 614
Points : 11 089
Points : 11 089
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.
Obsidian est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 22/06/2012, 07h08   #5
gangsoleil
Modérateur
 
Avatar de gangsoleil
 
R&D en systemes informatiques bas niveau Unix/Linux
Inscription : mai 2004
Messages : 7 191
Détails du profil
Informations personnelles :
Âge : 32
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 : 7 191
Points : 18 085
Points : 18 085
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
gangsoleil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/06/2012, 15h57   #6
matafan
Membre Expert
 
Homme
Ingénieur développement logiciels
Inscription : octobre 2008
Messages : 1 482
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 34
Localisation : France

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

Informations forums :
Inscription : octobre 2008
Messages : 1 482
Points : 2 438
Points : 2 438
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.
matafan est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 15h23.


 
 
 
 
Partenaires

Hébergement Web