tableau de fonctions en paramètre d'une fonction

Est-il possible de mètre un tableau de fonctions en paramètre d'une fonction ?

J'ai essayé ça :o

String arg10Func (String srt,int i);
String arg11Func (String srt,int i);
String arg12Func (String srt,int i);
String arg13Func (String srt,int i);
String arg14Func (String srt,int i);
String arg15Func (String srt,int i);
String arg16Func (String srt,int i);



String (*foncArg1[7])(String,int)=
{arg10Func,arg11Func,arg12Func,arg13Func,arg14Func,arg15Func,arg16Func};

void setup() {


}

void loop() {
  ptr(&foncArg1));
}
  String ptr (String str,String *(*foncArg1[]()) ) {                                      
  String msg;
  int i = 2;
 

   msg = foncArg[a](str,i)
      
      
  return msg

}
String arg10Func (String srt,int i){
  
}
String arg11Func (String srt,int i){
  
}
String arg12Func (String srt,int i){
  
}
String arg13Func (String srt,int i){
  
}
String arg14Func (String srt,int i){
  
}
String arg15Func (String srt,int i){
  
}
String arg16Func (String srt,int i){
  
}
[code]

J'ai ca comme erreur :cry:

sketch_test:22: error: declaration of 'foncArg1' as array of functions

   String ptr (String str,String *(*foncArg1[]()) ) {                                      

                                             ^

C:\Users\Sbran\OneDrive\Documents\Arduino\sketch_test\sketch_test.ino: In function 'void loop()':

sketch_test:20: error: expected ';' before ')' token

   ptr(&foncArg1));

                 ^

C:\Users\Sbran\OneDrive\Documents\Arduino\sketch_test\sketch_test.ino: At global scope:

sketch_test:22: error: declaration of 'foncArg1' as array of functions

   String ptr (String str,String *(*foncArg1[]()) ) {                                      

                                                ^

C:\Users\Sbran\OneDrive\Documents\Arduino\sketch_test\sketch_test.ino: In function 'String ptr(...)':

sketch_test:27: error: 'foncArg' was not declared in this scope

    msg = foncArg[a](str,i)

          ^

sketch_test:27: error: 'a' was not declared in this scope

    msg = foncArg[a](str,i)

                  ^

sketch_test:27: error: 'str' was not declared in this scope

    msg = foncArg[a](str,i)

                     ^

exit status 1
declaration of 'foncArg1' as array of functions

[code]

J'ai trouvé la solution si ça intéresse quelqu'un

plus les corrections, j'avais fait ca un peu à l'arrache :confused: :confused: :confused:

String arg10Func (String srt,int i);
String arg11Func (String srt,int i);
String arg12Func (String srt,int i);
String arg13Func (String srt,int i);
String arg14Func (String srt,int i);
String arg15Func (String srt,int i);
String arg16Func (String srt,int i);



String ((*foncArg1[7])(String,int))=
{arg10Func,arg11Func,arg12Func,arg13Func,arg14Func,arg15Func,arg16Func};

void setup() {
}

void loop() {
    String i = "";
    i =  ptr("0",foncArg1);
}
  String ptr (String str,String((*foncArg1[])(String,int))) {                                     
  String msg;
  int i = 2;
 

   msg = foncArg1[0](str,i);
      
      
  return msg ;

}
String arg10Func (String srt,int i){
 return "a" ;
}
String arg11Func (String srt,int i){
  return "b" ;
}
String arg12Func (String srt,int i){
  return "c" ;
}
String arg13Func (String srt,int i){
  return "d" ;
}
String arg14Func (String srt,int i){
  return "e" ;
}
String arg15Func (String srt,int i){
  return "f" ;
}
String arg16Func (String srt,int i){
  return "g" ;
}

avec ce type d'usage des String vous allez sans doute très vite morceler votre mémoire

pour ceux qui ont du mal à construire ce genre de déclaration, on procède par étapes logiques:
[color=blue]foncArg1[/color] le nom de la variable qu'on veut créer
foncArg1[color=blue][][/color] ce sera un tableau
foncArg1[[color=blue]7[/color]] de 7 éléments
[color=blue]*[/color] foncArg1[7] vers des pointeurs
[color=blue]([/color]* foncArg1[7][color=blue])()[/color] de fonction
(* foncArg1[7])([color=blue]String, int[/color]) prenant 2 param, une String et un int
[color=blue]String[/color] (* foncArg1[7])(String, int) retournant une String

donc vous avez une paire de parenthèse en trop

String (*foncArg1[7])(String, int) =
{arg10Func, arg11Func, arg12Func, arg13Func, arg14Func, arg15Func, arg16Func};

et on peut aussi laisser tomber le 7 puisque vous fournissez une liste d'initialisation

l'idéal pour la lisibilité c'est quand même d'utiliser un typedef mais votre approche est correcte

String arg10Func (String srt, int i);
String arg11Func (String srt, int i);
String arg12Func (String srt, int i);
String arg13Func (String srt, int i);
String arg14Func (String srt, int i);
String arg15Func (String srt, int i);
String arg16Func (String srt, int i);

typedef String (*FunctionPointer)(String, int);
FunctionPointer foncArg1[] = {arg10Func, arg11Func, arg12Func, arg13Func, arg14Func, arg15Func, arg16Func};

Merci beaucoup

Je pense que ceci devrait éviter le morcellement de la mémoire ?

char arg10Func (char srt, int i);
char arg11Func (char srt, int i);
char arg12Func (char srt, int i);
char arg13Func (char srt, int i);
char arg14Func (char srt, int i);
char arg15Func (char srt, int i);
char arg16Func (char srt, int i);

char (*foncArg1[])(char, int) =
{arg10Func, arg11Func, arg12Func, arg13Func, arg14Func, arg15Func, arg16Func};

void setup() {

}

void loop()
{
  char i = '0';
  i =  ptr('a', (foncArg1));
  printf("%i\n", i);
  printf("Hello, World!\n\n");
  return 0;
}

char ptr (char str, char (*foncArg1[])(char, int)) {
  int i = 3;


  str = foncArg1[0](str, i);


  return  str;

}
char arg10Func (char srt, int i) {
  return  i + 'a';
}
char arg11Func (char srt, int i) {
  return  'b';
}
char arg12Func (char srt, int i) {
  return  'c';
}
char arg13Func (char srt, int i) {
  return  'd';
}
char arg14Func (char srt, int i) {
  return  'e';
}
char arg15Func (char srt, int i) {
  return  'f';
}
char arg16Func (char srt, int i) {
  return  'g';
}

Il me reste plus que ca trouver comment retourner un tableau de char à la fin des fonctions !

Non faudrait des char* pour vos c-strings

Que doivent faire les fonctions ? Retourner un pointeur ce n’est pas plus compliqué que retourner un entier

char * f1(const char * s)
{
    static char str1[50]; // s’assurer d’avoir assez de place
    strcpy(str, “param = “);
    strcat(str, s); // ou pour ne pas déborder utiliser strncat() et 50-9-strlen(s) comme place totale et ne pas oublier de mettre un ‘\0’ à la fin au cas où
    return str1;
}