Appels des fonctions

Résolu
goast_tu Messages postés 212 Date d'inscription dimanche 3 avril 2005 Statut Membre Dernière intervention 28 mai 2011 - 24 sept. 2006 à 17:09
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 - 24 sept. 2006 à 21:17
Salut!

Est ce que vous pouvez me dire comment on fait pour appeler une
fonction presante dans le programme si on connait son nom sous forme
d'une chaine de caracteres. Par ex si dans mon programme  j'ai une
fonction toto() et j'aimerais l'appeler de la facon suivante:

appeler("toto");


Merci

14 réponses

luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
24 sept. 2006 à 19:17
Euh pour l'étoile, il doit surement en manquer une.  Mais j'ai un petit pb, car meme ca, ca marche:

    test[std::string("toto")] = &toto;

    test[std::string("toto2")] = &toto2;

   

    (****test[std::string("toto")])();

    (****test[std::string("toto2")])();


Doit y avoir une raison, ou alors un hasard extraordinaire, je vais essayer de voir pk.


En C ? C'est un peu la é'"(*-ù"$'(^-.

Ca ressemblera plutot a un truc comme ca.


#include


typedef void (*_function)(void);


void toto()

{

    std::cout << "coucou"  << std::endl;

}


void toto2()

{

    std::cout << "coucou 2" << std::endl;

}


int main()

{

    char * nom[2] = { "toto", "toto2" }; // <= allocation statique

    _function pointer[2] = { &toto, &toto2 };

   

    char * call_what = "toto1";

   

    for (int k = 0 ; k < 2 ; ++k)

        if (strcmp(call_what, nom[k]) == 0)

            pointer[k]();

   

    system("PAUSE");

   

    return 0;

}


Reste a organiser tout ca pour faire un truc propre.
3
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
24 sept. 2006 à 19:39
cout en C? C'est pas plutot printf?


Pour le reste, ce serais pas plus "propre" avec une structure?

#include <stdio.h>

typedef void (*_function)(void);

typedef struct _p_struct
{
   char *name;
   _function function;


} POINTEUR_STRUCT;

void toto()
{
    printf("coucou 1\n");
}

void toto2()
{
    printf("coucou 2\n");
}

int main()
{
    POINTEUR_STRUCT _p_struct[2] = {{"toto", toto}, {"toto2", toto2}};
    
    char * call_what = "toto";
   
    for (int k = 0 ; k < 2 ; ++k)
        if (strcmp(call_what, _p_struct[k].name) == 0)
            _p_struct[k].function();
    
    system("PAUSE");
   
    return 0;
}


C++ (@++)
___________________________________________
Les plus grands esprits trouvent toujours une solution<!--
3
nightlord666 Messages postés 746 Date d'inscription vendredi 17 juin 2005 Statut Membre Dernière intervention 23 mai 2007 10
24 sept. 2006 à 17:21
Impossible en C++, ou alors tu la déclare en __declspec(dllexport),et tu utilise LoadLibrary / GetProcAddress pour lancer ta fonction.

<hr size="2" width="100%" />Sachant qu'on peut toujours enlever une ligne à un programme, et que dans un programme il y a toujours un bug, un programme peut se résumer à une ligne avec un bug.
0
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
24 sept. 2006 à 18:35
Si c'est possible, mais un peu complexe.

Tu créer un tableau de pointeur de fonction.


typedef void (pointeur_fonction*)(void); => un truc du genre.

std::map<std::string, pointeur_fonction>;


Apres tu ajoutes les fonctions que tu veux, dans ton cas:

void toto();


map[std::string("toto")] = &toto;


Puis tu définies une fonction Appeler(const std::string & _func) qui fait:


map[func]();


Ex:

#include

#include <map>

#include <string>


typedef void (*_function)(void);


void toto()

{

    std::cout << "coucou" << std::endl;

}


int main()

{

    std::map<std::string, _function> test;

   

    test[std::string("toto")] = &toto;

   

    test[std::string("toto")](); <= appel de la fonction.

   

    system("PAUSE");

   

    return 0;

}


Mais bon, faut etre un peu tordu quand meme. Pk tu veux faire un truc pareil ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
nightlord666 Messages postés 746 Date d'inscription vendredi 17 juin 2005 Statut Membre Dernière intervention 23 mai 2007 10
24 sept. 2006 à 18:49
En effet j'avais pas pensé au tableau de pointeurs de fonctions, au temps pour moi...

<hr size="2" width="100%" />Sachant qu'on peut toujours enlever une ligne à un programme, et que dans un programme il y a toujours un bug, un programme peut se résumer à une ligne avec un bug.
0
goast_tu Messages postés 212 Date d'inscription dimanche 3 avril 2005 Statut Membre Dernière intervention 28 mai 2011 2
24 sept. 2006 à 18:56
luhtor et comment on le fais en C car je connai pratiquement rien en C++
0
goast_tu Messages postés 212 Date d'inscription dimanche 3 avril 2005 Statut Membre Dernière intervention 28 mai 2011 2
24 sept. 2006 à 18:58
j'ai une ptite question il manque pas par hasard un * devant   

test[std::string("toto")](); <= appel de la fonction.


?
0
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
24 sept. 2006 à 19:18
Bon j'ai oublié de corrigé, c'est pas call_what = "toto1", mais "toto" ou "toto2" évidemment.
0
niketou Messages postés 295 Date d'inscription dimanche 4 mai 2003 Statut Membre Dernière intervention 6 décembre 2010
24 sept. 2006 à 19:41
#include
#include <map>
#include <string>

//j' ai 20 erreur qui ont l'air de provenir de #include <map>
0
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
24 sept. 2006 à 19:51
J'ai bien précisé: " Ca ressemblera plutot " Donc évidemment, l'usage
de cout au lieu de printf, mais il peut convertir en C de lui meme ca.
:)


Evidemment, avec une structure, c'est bcp mieux d'ou ma derniere phrase "Reste a organiser tout ca pour faire un truc propre.".

Mais bon faut faire un truc encore mieux que ca. Un genre de manager,
auquel tu ajoutes toutes les fonctions que tu veux de facon dynamique
et que tu peux appeler quand tu veux et qui gère notamment plusieurs
type d'argument.

Car la, ca va pas etre facile de gérer des fonctions avec des arguments qui peuvent varier d'un type de fonction a un autre.


niketou => tu as quel IDE, c'est pas normal qu'il y ait un pb la dessus.
0
niketou Messages postés 295 Date d'inscription dimanche 4 mai 2003 Statut Membre Dernière intervention 6 décembre 2010
24 sept. 2006 à 20:26
Visual c++ 6.

c:\program files\microsoft visual studio\vc98\include\xtree(629) : error C2059: syntax error : '?'
c:\program files\microsoft visual studio\vc98\include\xtree(629) : error C2065: '_Y' : undeclared identifier
c:\program files\microsoft visual studio\vc98\include\xtree(629) : error C2275: '_A' : illegal use of this type as an expression
c:\program files\microsoft visual studio\vc98\include\xtree(629) : error C2143: syntax error : missin

etc,etc..
0
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
24 sept. 2006 à 20:38
Oula, j'en sais rien. Télécharge express 2005 :)
0
niketou Messages postés 295 Date d'inscription dimanche 4 mai 2003 Statut Membre Dernière intervention 6 décembre 2010
24 sept. 2006 à 20:49
Non desoler je garde mon vieux vc6,dommage ca m'aurait interesser aussi.
Tu n'as pas d'autres moyens sans inclure map stp?
0
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
24 sept. 2006 à 21:17
Bas tu peux toujours te programmer ta propre classe map. Mais ca m'étonne que vc6 ne supporte pas le type map de la stl.

Tu peux tjs faire ca avec un autre conteneur, mais faut que la recherche de la chaine soit relativement rapide.
0
Rejoignez-nous