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 :

Appel de fonction via dlsym


Sujet :

C

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 42
    Points : 38
    Points
    38
    Par défaut Appel de fonction via dlsym
    Bonjour,

    Je tente de lancer depuis un code une fonction se trouvant dans une librairie. Pour ce faire, j'utilise dlopen et dlsym :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    if (!((lib = dlopen(data.lib.c_str(), RTLD_LAZY)))){
    	printf("Error dlopen\n");
    	exit(EXIT_FAILURE);
    }
     
    if (!(funct = (void (*)()) dlsym(lib, data.func.c_str()))) {
    	dlclose(lib);
    	printf("Error dlsym\n");
    	exit(EXIT_FAILURE);
    }
     
    funct(data.arg);
    Les chaines de caractères sont contenues dans des variables car je veux lancer n'importe quelle fonction, mais qui ne prendrait toujours qu'un argument (une structure qui peut varier d'une fonction à une autre).

    A la compilation j'ai une erreur à l'appel de funct :
    manager.cpp:428: error: too many arguments to function

    J'ai fait un programme test où je passe le nom de la librairie et de la fonction en dur et ça fonctionne bien. Savez-vous pourquoi cela ne marche plus et comment remédier au problème svp ?

    Merci !!

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    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 369
    Points : 23 623
    Points
    23 623
    Par défaut
    Ce serait bien qu'on voie la ligne 428 et la déclaration de « funct » mais, à vue de nez :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    funct = (void (*)())
     
    funct(data.arg);
    « funct » a l'air d'être un pointeur sur une fonction de type « void f() », donc sans paramètre, et tu l'appelles avec un paramètre : « data.arg ». Donc le compilo se plaint (si c'est bien cette ligne qui est concernée).

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 42
    Points : 38
    Points
    38
    Par défaut
    Merci pour ton aide, j'ai pu trouver l'erreur :-)

    Il suffisait de remplacer

    par

    Bonne soirée !!

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

Discussions similaires

  1. appel de fonction via une variable
    Par rapido666 dans le forum Web
    Réponses: 5
    Dernier message: 25/04/2014, 11h08
  2. [DOM] appeler une fonction via son nom (qui est une string)
    Par elekis dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 15/07/2008, 13h06
  3. Appel fonction via un string
    Par Veovis dans le forum C++
    Réponses: 17
    Dernier message: 06/02/2007, 09h45
  4. Appeler une fonction Access via un .bat
    Par kluh dans le forum Access
    Réponses: 12
    Dernier message: 27/11/2005, 23h41
  5. Réponses: 8
    Dernier message: 13/08/2004, 12h32

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