Passer en argument le nom d'une fonction à exécuter
11 réponses
Nicolas Hervé
Je veux passer en option à ma fonction principale le nom d'une fonction
secondaire qui sera utilisé pour une certaine action.
Le but est de pouvoir choisir à l'exécution quel algo on va pouvoir
utiliser.
Ces fonctions secondaire seront dans une librairie chargé dynamiquement.
En quelque sorte je souhaite développer une API avec déjà quelques algos
implémentés pour ma fonction secondaire et permettre à l'utilisateur
d'étendre à d'autres algos.
Les fonctions peuvent avoir le même nom. Ça évite de le calculer.
Nicolas Hervé
Laurent Wacrenier wrote:
Les fonctions peuvent avoir le même nom. Ça évite de le calculer.
Effectivement les fonctions peuvent avoir le même nom, mais dans ce cas çà oblige à créer des librairies différentes et à refaire une édition de lien (ou à modifier un lien symbolique vers la bonne librairie) à chaque fois qu'on veut changer d'implémentation. Non ?
Mes fonctions secondaires sont des algos d'optimisation. Suivant le compromis recherché, l'utilisateur pourra choisir par exemple un algorithme qui converge rapidement vers une solution acceptable ou plutôt un algorithme plus lent mais qui offrira une solution de meilleure qualité.
Comment fonctionnent dlopen()/dlsym() ?
Laurent Wacrenier wrote:
Les fonctions peuvent avoir le même nom.
Ça évite de le calculer.
Effectivement les fonctions peuvent avoir le même nom, mais dans ce cas
çà oblige à créer des librairies différentes et à refaire une édition de
lien (ou à modifier un lien symbolique vers la bonne librairie) à chaque
fois qu'on veut changer d'implémentation. Non ?
Mes fonctions secondaires sont des algos d'optimisation. Suivant le
compromis recherché, l'utilisateur pourra choisir par exemple un
algorithme qui converge rapidement vers une solution acceptable ou
plutôt un algorithme plus lent mais qui offrira une solution de
meilleure qualité.
Les fonctions peuvent avoir le même nom. Ça évite de le calculer.
Effectivement les fonctions peuvent avoir le même nom, mais dans ce cas çà oblige à créer des librairies différentes et à refaire une édition de lien (ou à modifier un lien symbolique vers la bonne librairie) à chaque fois qu'on veut changer d'implémentation. Non ?
Mes fonctions secondaires sont des algos d'optimisation. Suivant le compromis recherché, l'utilisateur pourra choisir par exemple un algorithme qui converge rapidement vers une solution acceptable ou plutôt un algorithme plus lent mais qui offrira une solution de meilleure qualité.
Comment fonctionnent dlopen()/dlsym() ?
Yves ROMAN
Je veux passer en option à ma fonction principale le nom d'une fonction secondaire qui sera utilisé pour une certaine action. Le but est de pouvoir choisir à l'exécution quel algo on va pouvoir utiliser.
Ces fonctions secondaire seront dans une librairie chargé dynamiquement.
En quelque sorte je souhaite développer une API avec déjà quelques algos implémentés pour ma fonction secondaire et permettre à l'utilisateur d'étendre à d'autres algos.
Ca dépend de ta plateforme : ex sous Solaris (et peut-être d'autres Unix) voir dlopen(), dlsym()
En C standard, dans ta librairie dynamique, rajoute une fonction qui donne l'adresse d'une fonction à partir de son nom : elle se base sur un tableau qui contient une liste de couples { char * , void (*)() } des fonctions de la librairie.
Je veux passer en option à ma fonction principale le nom d'une fonction
secondaire qui sera utilisé pour une certaine action.
Le but est de pouvoir choisir à l'exécution quel algo on va pouvoir
utiliser.
Ces fonctions secondaire seront dans une librairie chargé dynamiquement.
En quelque sorte je souhaite développer une API avec déjà quelques algos
implémentés pour ma fonction secondaire et permettre à l'utilisateur
d'étendre à d'autres algos.
Ca dépend de ta plateforme :
ex sous Solaris (et peut-être d'autres Unix) voir dlopen(), dlsym()
En C standard, dans ta librairie dynamique, rajoute une fonction qui donne
l'adresse d'une fonction à partir de son nom : elle se base sur un tableau qui
contient une liste de couples { char * , void (*)() } des fonctions de la
librairie.
Je veux passer en option à ma fonction principale le nom d'une fonction secondaire qui sera utilisé pour une certaine action. Le but est de pouvoir choisir à l'exécution quel algo on va pouvoir utiliser.
Ces fonctions secondaire seront dans une librairie chargé dynamiquement.
En quelque sorte je souhaite développer une API avec déjà quelques algos implémentés pour ma fonction secondaire et permettre à l'utilisateur d'étendre à d'autres algos.
Ca dépend de ta plateforme : ex sous Solaris (et peut-être d'autres Unix) voir dlopen(), dlsym()
En C standard, dans ta librairie dynamique, rajoute une fonction qui donne l'adresse d'une fonction à partir de son nom : elle se base sur un tableau qui contient une liste de couples { char * , void (*)() } des fonctions de la librairie.
Nicolas Hervé
Ok pour dlopen(), dlsym(), dlclose() en C pure (pas ++). Je vais essayer ca dans un premier temps.
Par contre, je ne comprends pas la solution en C standard, et je ne saurrait pas écrire une fonction qui donne l'adresse d'une autre à partir de son nom.
Yves ROMAN wrote:
Je veux passer en option à ma fonction principale le nom d'une fonction secondaire qui sera utilisé pour une certaine action. Le but est de pouvoir choisir à l'exécution quel algo on va pouvoir utiliser.
Ces fonctions secondaire seront dans une librairie chargé dynamiquement.
En quelque sorte je souhaite développer une API avec déjà quelques algos implémentés pour ma fonction secondaire et permettre à l'utilisateur d'étendre à d'autres algos.
Ca dépend de ta plateforme : ex sous Solaris (et peut-être d'autres Unix) voir dlopen(), dlsym()
En C standard, dans ta librairie dynamique, rajoute une fonction qui donne l'adresse d'une fonction à partir de son nom : elle se base sur un tableau qui contient une liste de couples { char * , void (*)() } des fonctions de la librairie.
Ok pour dlopen(), dlsym(), dlclose() en C pure (pas ++).
Je vais essayer ca dans un premier temps.
Par contre, je ne comprends pas la solution en C standard, et je ne
saurrait pas écrire une fonction qui donne l'adresse d'une autre à
partir de son nom.
Yves ROMAN wrote:
Je veux passer en option à ma fonction principale le nom d'une fonction
secondaire qui sera utilisé pour une certaine action.
Le but est de pouvoir choisir à l'exécution quel algo on va pouvoir
utiliser.
Ces fonctions secondaire seront dans une librairie chargé dynamiquement.
En quelque sorte je souhaite développer une API avec déjà quelques algos
implémentés pour ma fonction secondaire et permettre à l'utilisateur
d'étendre à d'autres algos.
Ca dépend de ta plateforme :
ex sous Solaris (et peut-être d'autres Unix) voir dlopen(), dlsym()
En C standard, dans ta librairie dynamique, rajoute une fonction qui donne
l'adresse d'une fonction à partir de son nom : elle se base sur un tableau qui
contient une liste de couples { char * , void (*)() } des fonctions de la
librairie.
Ok pour dlopen(), dlsym(), dlclose() en C pure (pas ++). Je vais essayer ca dans un premier temps.
Par contre, je ne comprends pas la solution en C standard, et je ne saurrait pas écrire une fonction qui donne l'adresse d'une autre à partir de son nom.
Yves ROMAN wrote:
Je veux passer en option à ma fonction principale le nom d'une fonction secondaire qui sera utilisé pour une certaine action. Le but est de pouvoir choisir à l'exécution quel algo on va pouvoir utiliser.
Ces fonctions secondaire seront dans une librairie chargé dynamiquement.
En quelque sorte je souhaite développer une API avec déjà quelques algos implémentés pour ma fonction secondaire et permettre à l'utilisateur d'étendre à d'autres algos.
Ca dépend de ta plateforme : ex sous Solaris (et peut-être d'autres Unix) voir dlopen(), dlsym()
En C standard, dans ta librairie dynamique, rajoute une fonction qui donne l'adresse d'une fonction à partir de son nom : elle se base sur un tableau qui contient une liste de couples { char * , void (*)() } des fonctions de la librairie.
Laurent Wacrenier
Nicolas Hervé écrit:
Effectivement les fonctions peuvent avoir le même nom, mais dans ce cas çà oblige à créer des librairies différentes et à refaire une édition de lien (ou à modifier un lien symbolique vers la bonne librairie) à chaque fois qu'on veut changer d'implémentation. Non ?
Quel est l'interêt de lier dynamquement à l'execution alors que tout est dans le même fichier ?
Mes fonctions secondaires sont des algos d'optimisation. Suivant le compromis recherché, l'utilisateur pourra choisir par exemple un algorithme qui converge rapidement vers une solution acceptable ou plutôt un algorithme plus lent mais qui offrira une solution de meilleure qualité.
Heu.. êtes vous sûr que vous voulez des librairies dynamiques alors qu'un simple pointeur de fonction ferait l'affaire.
Comment fonctionnent dlopen()/dlsym() ?
C'est indiqué dans le manuel.
Nicolas Hervé <nicolas.herveNO@SPAMenssat.fr> écrit:
Effectivement les fonctions peuvent avoir le même nom, mais dans ce cas
çà oblige à créer des librairies différentes et à refaire une édition de
lien (ou à modifier un lien symbolique vers la bonne librairie) à chaque
fois qu'on veut changer d'implémentation. Non ?
Quel est l'interêt de lier dynamquement à l'execution alors que tout
est dans le même fichier ?
Mes fonctions secondaires sont des algos d'optimisation. Suivant le
compromis recherché, l'utilisateur pourra choisir par exemple un
algorithme qui converge rapidement vers une solution acceptable ou
plutôt un algorithme plus lent mais qui offrira une solution de
meilleure qualité.
Heu.. êtes vous sûr que vous voulez des librairies dynamiques alors
qu'un simple pointeur de fonction ferait l'affaire.
Effectivement les fonctions peuvent avoir le même nom, mais dans ce cas çà oblige à créer des librairies différentes et à refaire une édition de lien (ou à modifier un lien symbolique vers la bonne librairie) à chaque fois qu'on veut changer d'implémentation. Non ?
Quel est l'interêt de lier dynamquement à l'execution alors que tout est dans le même fichier ?
Mes fonctions secondaires sont des algos d'optimisation. Suivant le compromis recherché, l'utilisateur pourra choisir par exemple un algorithme qui converge rapidement vers une solution acceptable ou plutôt un algorithme plus lent mais qui offrira une solution de meilleure qualité.
Heu.. êtes vous sûr que vous voulez des librairies dynamiques alors qu'un simple pointeur de fonction ferait l'affaire.
Comment fonctionnent dlopen()/dlsym() ?
C'est indiqué dans le manuel.
Yves ROMAN
Ok pour dlopen(), dlsym(), dlclose() en C pure (pas ++). Je vais essayer ca dans un premier temps.
Par contre, je ne comprends pas la solution en C standard, et je ne saurrait pas écrire une fonction qui donne l'adresse d'une autre à partir de son nom.
Yves ROMAN wrote:
En C standard, dans ta librairie dynamique, rajoute une fonction qui donne l'adresse d'une fonction à partir de son nom : elle se base sur un tableau qui contient une liste de couples { char * , void (*)() } des fonctions de la librairie.
Ok pour dlopen(), dlsym(), dlclose() en C pure (pas ++).
Je vais essayer ca dans un premier temps.
Par contre, je ne comprends pas la solution en C standard, et je ne
saurrait pas écrire une fonction qui donne l'adresse d'une autre à
partir de son nom.
Yves ROMAN wrote:
En C standard, dans ta librairie dynamique, rajoute une fonction qui donne
l'adresse d'une fonction à partir de son nom : elle se base sur un tableau qui
contient une liste de couples { char * , void (*)() } des fonctions de la
librairie.
Ok pour dlopen(), dlsym(), dlclose() en C pure (pas ++). Je vais essayer ca dans un premier temps.
Par contre, je ne comprends pas la solution en C standard, et je ne saurrait pas écrire une fonction qui donne l'adresse d'une autre à partir de son nom.
Yves ROMAN wrote:
En C standard, dans ta librairie dynamique, rajoute une fonction qui donne l'adresse d'une fonction à partir de son nom : elle se base sur un tableau qui contient une liste de couples { char * , void (*)() } des fonctions de la librairie.
Quel est l'interêt de lier dynamquement à l'execution alors que tout est dans le même fichier ?
J'ai pas compris toute suite le sens de la question (et encore je ne suis pas sure d'avoir bien saisi) Oui effectivement, les différentess fonctions que j'implémentent seraient bien toutes dans la même librairie.
Heu.. êtes vous sûr que vous voulez des librairies dynamiques alors qu'un simple pointeur de fonction ferait l'affaire.
Si le nombre de fonctions est figé et qu'il n'y a pas besoin d'en rajouter oui mais si on veut permettre à l'utilisateur d'ajouter les siennes, les librairies dynamiques me semblent plus appropriées.
Maintenant qu'est il usage de faire dans ce cas ? En gros, les procédures d'optimisation viennent comme un plug-in sur l'application générale.
NB: je n'ai jamais manipulé de pointeurs de fonctions.
Comment fonctionnent dlopen()/dlsym() ?
C'est indiqué dans le manuel.
Comme oujours RTFM :-)
Laurent Wacrenier wrote:
Quel est l'interêt de lier dynamquement à l'execution alors que tout
est dans le même fichier ?
J'ai pas compris toute suite le sens de la question (et encore je ne
suis pas sure d'avoir bien saisi)
Oui effectivement, les différentess fonctions que j'implémentent
seraient bien toutes dans la même librairie.
Heu.. êtes vous sûr que vous voulez des librairies dynamiques alors
qu'un simple pointeur de fonction ferait l'affaire.
Si le nombre de fonctions est figé et qu'il n'y a pas besoin d'en
rajouter oui mais si on veut permettre à l'utilisateur d'ajouter les
siennes, les librairies dynamiques me semblent plus appropriées.
Maintenant qu'est il usage de faire dans ce cas ?
En gros, les procédures d'optimisation viennent comme un plug-in sur
l'application générale.
NB: je n'ai jamais manipulé de pointeurs de fonctions.
Quel est l'interêt de lier dynamquement à l'execution alors que tout est dans le même fichier ?
J'ai pas compris toute suite le sens de la question (et encore je ne suis pas sure d'avoir bien saisi) Oui effectivement, les différentess fonctions que j'implémentent seraient bien toutes dans la même librairie.
Heu.. êtes vous sûr que vous voulez des librairies dynamiques alors qu'un simple pointeur de fonction ferait l'affaire.
Si le nombre de fonctions est figé et qu'il n'y a pas besoin d'en rajouter oui mais si on veut permettre à l'utilisateur d'ajouter les siennes, les librairies dynamiques me semblent plus appropriées.
Maintenant qu'est il usage de faire dans ce cas ? En gros, les procédures d'optimisation viennent comme un plug-in sur l'application générale.
NB: je n'ai jamais manipulé de pointeurs de fonctions.
Comment fonctionnent dlopen()/dlsym() ?
C'est indiqué dans le manuel.
Comme oujours RTFM :-)
Laurent Wacrenier
Nicolas Hervé écrit:
J'ai pas compris toute suite le sens de la question (et encore je ne suis pas sure d'avoir bien saisi) Oui effectivement, les différentess fonctions que j'implémentent seraient bien toutes dans la même librairie.
Alors il faudra saisir le nom de la librairie et le nom de la fonction (c'est à dire les paramêtres pour dlopen et dlsym).
Nicolas Hervé <nicolas.herveNO@SPAMenssat.fr> écrit:
J'ai pas compris toute suite le sens de la question (et encore je ne
suis pas sure d'avoir bien saisi)
Oui effectivement, les différentess fonctions que j'implémentent
seraient bien toutes dans la même librairie.
Alors il faudra saisir le nom de la librairie et le nom de la
fonction (c'est à dire les paramêtres pour dlopen et dlsym).
J'ai pas compris toute suite le sens de la question (et encore je ne suis pas sure d'avoir bien saisi) Oui effectivement, les différentess fonctions que j'implémentent seraient bien toutes dans la même librairie.
Alors il faudra saisir le nom de la librairie et le nom de la fonction (c'est à dire les paramêtres pour dlopen et dlsym).