3 votes

Appeler différentes fonctions en utilisant l'accès direct aux paramètres en C

Je suis récemment tombé sur cette page . J'ai été particulièrement intéressée par la section relative à l'accès direct aux paramètres.

Je me demandais s'il existait un moyen d'exécuter une seule des fonctions en fonction de la valeur de n dans la ligne suivante :

printf("%n$p", func1, func2, func3 .. funcN);

où func1, ont la signature int func1(), int func2(), et ainsi de suite . Il s'agit d'une restriction car je pourrais vouloir que la fonction tha retourne également void.

Dans la ligne ci-dessus, seule l'adresse de la fonction est imprimée ; la fonction n'est pas appelée.

J'ai même essayé d'utiliser le ',' (opérateur virgule) pour y parvenir, mais dans ce cas, todos les fonctions de la liste sont appelées et le résultat correspondant au "n" est imprimé.

Existe-t-il un moyen d'exécuter la fonction à l'intérieur de printf( ) ?

Gracias.

5voto

Alex Martelli Points 330805

Pas en une seule ligne, mais quelque chose comme :

typedef int (*fp)();
fp[] thefuncs = {func1, func2, func3, func4};
printf("%d", fp[n]());

semble être un début. Si les fonctions renvoient void, plutôt que int, que pensez-vous imprimer ?

2voto

R Samuel Klatchko Points 44549

Non, vous ne pouvez pas faire cela avec printf, car printf ne prend pas en charge l'invocation de paramètres de pointeurs de fonction.

Mais vous pouvez écrire votre propre fonction qui fait cela en utilisant stdarg :

#include <stdarg.h>

void invoke_and_print(unsigned int n, ...)
{
    va_list ap;
    va_start(ap, n);

    int (*fp)(void) = NULL;
    while (n-- != 0)
    {
        fp = va_arg(ap, int (*)(void));            
    }
    va_end(ap);

    printf("%d\n", (*fp)());
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X