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 :

Appeld'une fonction definie par une variable de type char[]


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2007
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 34
    Points : 20
    Points
    20
    Par défaut Appeld'une fonction definie par une variable de type char[]
    Bonjour,

    voila mon probleme (qui n'en est pas un peut etre) :

    A partir de l'analyse de certaines variables d'environnements dont les valeurs different selon les cas, j'obtiens une variable de type char FileToSet qui correspond au nom du programme à executer.

    Comment faire pour executer ce programme ?

    J'ai essayé avec execlp mais je n'ai pas eu de resultats probants.
    Ancienne commande :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int exec_return = 0;
    int exec_pattern = 0;
     
    exec_pattern=fork();
    exec_return=execlp("FileToSet", "FileToSet", "Arg1", NULL);

    Avez vous une idée de la marche à suivre pour executer correctement mon programme ??

    Merci d'avance.

  2. #2
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par kanonji
    A partir de l'analyse de certaines variables d'environnements dont les valeurs different selon les cas, j'obtiens une variable de type char FileToSet qui correspond au nom du programme à executer.

    Comment faire pour executer ce programme ?
    Si FileToSet pointe sur un tableau de char représentant le nom du programme sous une forme valide, un simple
    devrai suffire.

  3. #3
    Membre éclairé Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Points : 771
    Points
    771
    Par défaut
    Une solution simple:
    EDIT: OK, pas assez rapide...

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2007
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 34
    Points : 20
    Points
    20
    Par défaut
    Merci beaucoup.

    Et si FileToSet prend un argument, est ce que system(FileToSet(arg)); va marcher correctement ?

    Je connaissais system mais je pensais que execlp etait mieux.
    J'eus tort.

    Merci.

  5. #5
    Membre régulier Avatar de Beldom
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 63
    Points : 70
    Points
    70
    Par défaut
    System ne prend qu'une chaine de caractère en paramètre.

    Si ton programe FileToSet prend un argument, tu dois envoyer quelquechose comme
    system("FileToSet Arg1 Arg2");

    Une solution pour créer la chaine peut être l'utilisation de strcat, mais je crois qu'il y'en a des meilleures avec les fonctions dérivées de printf et/ou scanf

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2007
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 34
    Points : 20
    Points
    20
    Par défaut
    Helas,
    meme un system(FileToSet); ou system("FileToSet Argument1"); ne marche pas.
    Mon probleme reside dans le fait que la valeur de FileToSet est le nom d'une fonction appartenant à un autre module dont le .h est inclus dans le code C en question.

    En fait, l'interet de ma variable FileToSet est qu'elle permet de determiner generiquement une batterie de fonctions à appeler sans avoir à hardcoder de cas particuliers.

    Donc, peut etre devrais-je reformuler ma question en "Comment appeler une fonction qui est definie par un tableau de char ???".

    Merci d'avance pour votre aide tres precieuse.
    Ludovic

  7. #7
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par kanonji
    Et si FileToSet prend un argument, est ce que system(FileToSet(arg)); va marcher correctement ?
    Evidemment non. C'est la chaine de caractères qui doit représenter une commande valide. Tu peux la former avec sprintf(), par exemple.

    N'oublie pas d'afficher le résultat de ta construction de chaine avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       printf ("'%s'\n", chaine);
    avant d'appeler system(), histoire de vérifier ce que tu passes à system().

    J'insiste sur le ' de chaque coté de %s. Ca permet d'être sûr qu'il n'y a pas de caractères intempestifs comme un '\n', par exemple...

    La chaine "monappli param1 param2"
    Doit donner
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    'monappli param1 param2'
    et non
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    'monappli param1 param2
    '
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    'monappli
     param1 param2'
    ou que sais-je encore, si on a oublié de retirer le \n final suite à fgets(), par exemple...

  8. #8
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par kanonji
    meme un system(FileToSet); ou system("FileToSet Argument1"); ne marche pas.
    Mon probleme reside dans le fait que la valeur de FileToSet est le nom d'une fonction appartenant à un autre module dont le .h est inclus dans le code C en question.
    Quoi ? Nom de fonction ? Tu n'avais jamais parlé de ça jusqu'ici. Les fonctions ne sont pas accessibles par system(). Tu dois fabriquer un interprétéur de commande qui fait qu'une chaoine reçue (commande) déclenche l'exécution de tel ou tel sous programme(fonction). Ce n'est pas difficile, mais il faut être très précis dans la définition des problèmes, sinon, on répond à-coté...
    Donc, peut etre devrais-je reformuler ma question en "Comment appeler une fonction qui est definie par un tableau de char ???".
    Ca me parait en effet être un bon début...

    Ceci peut aider :

    http://emmanuel-delahaye.developpez.com/clib.htm
    Module CI

  9. #9
    Membre régulier Avatar de Beldom
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 63
    Points : 70
    Points
    70
    Par défaut
    Si je comprend bien, tu as un tableau, avec des chaines de caractères, ces chaines étant la réplique d'un nom de fonction ?
    C'est plus un programme ca ^^

    Si c'est ca, je peux te proposer un tableau de structure, à condition que toutes tes fonctions prennent le même nombre d'argument et le même type.
    Sinon, ca doit être faisable aussi en var args avec une structure, mais je ne me suis jamais penché sur le problème, et comme ca, je n'ai pas de solution.

    Code : 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
     
    typedef struct s_fonc
    {
       char   *name;
       void    (*f)(int arg1);
    }                  t_fonc;
     
    t_fonc  fonc[] =
      {
        {"Ma_Fonction_1", ma_fonction_1},
        {"Ma_Fonction_2", ma_fonction_2},
        {0, 0}
      };
     
    // Pour l'appeller :
     
    int main
    {
       int i;
     
        if (!strcmp(fonc[0].name, "Ma_Fonction_1")
            fonc[0].f(0);
     
      //Ou encore, pour trouver la bonne fonction :
     
       for (i = 0; fonc[i].name; i++)
          if (!strcmp(fonc[i].name, "Ma_Fonction_1")
             {
                 fonc[i].f(0);
                 break;
             }
    }
    Je ne suis pas sûr que cela corresponde exactement à ce que tu recherches par contre... Même si j'espère que si ^^

    Petite note : Ce n'est pas forcément la meilleure solution hein

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2007
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 34
    Points : 20
    Points
    20
    Par défaut
    Merci pour vos reponses mais je me pose la question suivante :

    Comment faire pour appeler la bonne fonction sans definir une structure avec la liste de fonctions ?

    En effet, le but de ce code est d'enlever toute une partie "hardcodée".
    Jusqu'à ce probleme tout allait bien mais mon objectif est de pouvoir appeler la bonne fonction sans connaitre toute la liste existante de fonctions possibles.

    Une idée ??

    Ludovic

  11. #11
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par kanonji
    Comment faire pour appeler la bonne fonction sans definir une structure avec la liste de fonctions ?

    En effet, le but de ce code est d'enlever toute une partie "hardcodée".
    Jusqu'à ce probleme tout allait bien mais mon objectif est de pouvoir appeler la bonne fonction sans connaitre toute la liste existante de fonctions possibles.
    Ce n'est pas possible.

  12. #12
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 916
    Points
    17 916
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par kanonji
    Merci pour vos reponses mais je me pose la question suivante :

    Comment faire pour appeler la bonne fonction sans definir une structure avec la liste de fonctions ?

    En effet, le but de ce code est d'enlever toute une partie "hardcodée".
    Jusqu'à ce probleme tout allait bien mais mon objectif est de pouvoir appeler la bonne fonction sans connaitre toute la liste existante de fonctions possibles.

    Une idée ??

    Ludovic
    Tout dépend de ce que tu veux faire..

    Si tu as ABSOLUMENT une liste de fonctions connues, et que tu voudrais faire un fichier texte pour affecter, comme a dit Emmanuel, c'est impossible (au runtime, il n'y a pas possibilités de liens entre du texte et du code compilé).

    Si tu veux pouvoir faire un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       Appelle_Fonction ( type )
    alors un système de fonctions enregistrées marche. Mais c'est toujours hardcodé, c'est juste que c'est déporté....

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 05/04/2011, 08h06
  2. Variable dans une fonction appelée par une autre fonction
    Par CyrilD dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 21/12/2010, 13h42
  3. lire une macro definie par une variable
    Par L'elfe d'Azur dans le forum C
    Réponses: 5
    Dernier message: 20/09/2008, 14h29
  4. [SQL] php et recuperation d'une valeur renvoyée par une fonction sql
    Par highman dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 21/06/2006, 15h42
  5. Réponses: 11
    Dernier message: 31/10/2005, 17h59

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