Je suis sur un projet et il me reste plus que cette étape pour finir, ce que je souhaite :
Ma fonction à exécuté.
void test();
{
.....
}
Mon String qui contient ma fonction
String test2 = "test();"
Appelle de la fonction
test;
Cependant je sais que ce n'est pas possible mais je n'ai pas de solutions, il faut savoir que je ne connais pas mes fonctions à l'avance ( elles sont rentré par l'utilisateur )
La méthode :
void (*myFunctions[])(void)={test};
Pourrais fonctionner si je rentrerais la fonction en dur dans le code, or ici c'est l'utilisateur qui va rentrer la fonction à exécuté, je ne peux pas convertir un String en void ( du moins à ma connaissance )
Il n'y a pas de solution au sens où tu l'entends. Tu dois comparer le nom de fonction entré par l'utilisateur à ceux que tu as dans ton code, et appeler celle qui convient.
Pour le faire, ça dépend du type de variable que tu utilises pour lire ce qui est entré dans la console :
En pseudo code, tu crées un tableau avec les noms de tes fonctions
Acquérir l'entrée de l'utilisateur
Pour i variant de 0 au nombre de fonctions
Comparer le nom entré par l'utilisateur au nom de fonction indicé 'i'
Si égalité, appeler la fonction
Sinon, continuer la boucle
Il est possible de créer un tableau de fonctions et d'exécuter la fonction numéro 'i' de ce tableau. Voir le code ici. Il faut que toutes les fonctions aient le même nombre d'arguments.
quand on appelle une fonction dans son code , il faut faire
test();
et pas test ; comme dans votre premier post .
par la suite vous pouvez tres bien testé si l ' utilisateur a entré des données , tester si elles sont celles attendues , puis lancez une fonction .
c ' est transparent pour l' utilisateur .
Il suffit de comparer la chaîne reçue avec une chaîne qui contient le nom de la fonction.
String strFonction;
// Réception du nom de la fonction
// ...
if (strFonction=="test1")
test1();
else if (strFonction=="test2")
test2();
else if (strFonction=="test3")
test3();
else if (strFonction=="test4")
test4();
// ...
Remarque: il est conseillé de ne pas utiliser les String mais plutôt d'utiliser les c_string (tableau de char) avec strcmp.
Je ne vois pas très bien l'utilité d'appeler une fonction par son nom.
enum : uint8_t {fonction1, fonction2, fonction3, fonction4, fonction5};
const char* tableauDeFonctions [ fonction5 ] = {"fonction1()", "fonction2()", "fonction3()", "fonction4()", "fonction5()"};
if ( donneUtilisateurEntre ) { // controle que l ' utilisateur a entre un truc
for ( byte i = 0; i < fonction5; i++ ) { // boucle
if ( donneUtilisateurEntre == i ) { //comparaison des données utilisateurs avec un enum du nom des fonctions
Serial.print(tableauDeFonctions [ i ])
}
}
}
}
le tableau et le enum etait donné en exemple il ne faut pas mettre les 2 , meme si j' ai fais un mix dans le code d' exemple que j' ai tapé en catastrophe diretement ici , sans verifier avec l ' IDE.
voici une debut de piste qui est valide dans l' IDE , avec un tableau qui pourrait etre utilisé , reste ensuite a a adapter avec ton code .
char donneUtilisateurEntre;
const char* tableauDeFonctions [ 5 ] = {"fonction1()", "fonction2()", "fonction3()", "fonction4()", "fonction5()"};
void testEntreeUtilisateur () {
if ( donneUtilisateurEntre ) { // controle que l ' utilisateur a entre un truc
for ( byte i = 0; i < 5; i++ ) { // boucle
if ( donneUtilisateurEntre == i ) { //comparaison des données utilisateurs avec un enum du nom des fonctions
Serial.print(tableauDeFonctions [ i ]);
}
}
}
}
Le code marche parfaitement, néanmoins on ne peux pas exécuter la fonction écrite dans le tableau, il permet bien de récupéré et de faire une comparaison, le soucis étant que je souhaite aussi après cette manœuvre que la fonction sois exécute, c'est pour cela que j'avais au départ utilisé
ba , il suffit de remplacer le serial print dans mon exemple , par l' appel a la fonction correspondante .
avec le if else que t ' a donné kamill dans sa reponse precedente ...
comme cela :
//enum : uint8_t {fonction1, fonction2, fonction3, fonction4, fonction5};
char donneUtilisateurEntre;
const char* tableauDeFonctions [ 5 ] = {"fonction1()", "fonction2()", "fonction3()", "fonction4()", "fonction5()"};
void fonction1 () {
Serial.println("fonction 1 executée");
}
void fonction2 () {
Serial.println("fonction 2 executée");
}
void testEntreeUtilisateur () {
if ( donneUtilisateurEntre ) { // controle que l ' utilisateur a entre un truc
for ( byte i = 0; i < 5; i++ ) { // boucle
if ( donneUtilisateurEntre == i ) { //comparaison des données utilisateurs avec un enum du nom des fonctions
Serial.print(tableauDeFonctions [ i ]);
if ( tableauDeFonctions [ i ] == "fonction1" ) fonction1();
else if (tableauDeFonctions [ i ] == "fonction2" ) fonction2();
/// etc
}
}
}
}
void setup() {
Serial.begin(115200);
// put your setup code here, to run once:
}
void loop() {
// put your main code here, to run repeatedly:
}