• # il suffit de faire une fonction qui accepte une va_list

    Posté par . En réponse au message fonction à nombre variable de paramètre. Évalué à 1.

    en fait, il suffit de passer le va_list en argument.
    c'est utilise tres frequement, notamment pour appeller vfprintf.

    si je veux faire une fonction qui log au moyen d'une structure log je peux par exemple ecrire

    struct loginfo {
    const char *channel;
    FILE *fd;
    };

    void
    log_log(struct loginfo *li, const char *fmt, ...)
    {
    va_list ap;

    fprintf(li->fd, "%s: ", channel);
    va_start(ap, fmt);
    vfprintf(li->fd, fmt, ap);
    va_end(ap);
    fprintf(li->fd, "\n");
    }

    int
    main(int ac, char **av)
    {
    struct loginfo li;

    memset(&li, 0, sizeof (struct loginfo));
    li.fd = stdout;
    li.channel = 'monprog';
    log_log(&li, "ca marche tout comme printf, %s", "c'est vraiment trop bien");
    return 0;
    }

    en resume y aura pas trop de soucis pour transposer de ton cote:

    int
    moyenne(int nbr, ...)
    {
    int sum;
    va_list ap;

    va_start(ap,nbr);
    sum = somme(nbr, ap);
    va_end(ap);
    return sum / nbr;
    }

    int
    somme(int nbr, va_list args)
    {
    int sum;

    for (sum = 0; nbr--;)
    sum += va_arg(args, int);
    return sum;
    }