IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

va_arg, va_start, va_end, que font ces fonctions???


Sujet :

C

  1. #1
    Membre habitué Avatar de richard_sraing
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Avril 2005
    Messages
    483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Avril 2005
    Messages : 483
    Points : 182
    Points
    182
    Par défaut va_arg, va_start, va_end, que font ces fonctions???
    Bonsoir à vous,


    Je voudrais savoir ce que font les fonctions, va_arg, va_start, va_end. on professeurs, m'a demander de faire un programme utilisant l'allocation et des fonctions à passages de paramètres différent (variables) pour vérifier les clé primaire dans un tableau. Il m'a dit d'utiliser ces fonctions, sans me dire comment elles fonctionnent. J'ai beau essayer de comprendre ce qu'elles font, mais aucunes idées.

    Si quelqu'un d'entre vous pouvait me l'expliquer ou m'envoyer le code de ces fonctions pour que je l'analyse, cela m'aiderai beaucoup.

    Je vous remercie d'avance pour votre aide,


    Richard_sraing.

  2. #2
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Ce sont des fonctions associées aux fonctions dites variadic, admettant un nombre non précisé de paramètres. Elles permettent de connaître l'adresse des paramètres passés.
    Par exemple, si on souhaite réaliser un wrapper de fprintf sur stderr (pour sortir une erreur), on fait comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    #include <stdio.h>
    #include <stdarg.h>
     
    void error(const char *fmt, ...)
    {
    	va_list argp;
    	fprintf(stderr, "error: ");
    	va_start(argp, fmt);
    	vfprintf(stderr, fmt, argp);
    	va_end(argp);
    	fprintf(stderr, "\n");
    }
    va_list est un type opaque regroupant les paramètres passés.

  3. #3
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut Re: va_arg, va_start, va_end, que font ces fonctions???
    Citation Envoyé par richard_sraing
    Je voudrais savoir ce que font les fonctions, va_arg, va_start, va_end.
    Elles servent à écrire des fonctions 'variadic', c'est à dire à nombre variable de paramètres comme printf(), par exemple.
    on professeurs, m'a demander de faire un programme utilisant l'allocation et des fonctions à passages de paramètres différent (variables) pour vérifier les clé primaire dans un tableau. Il m'a dit d'utiliser ces fonctions, sans me dire comment elles fonctionnent. J'ai beau essayer de comprendre ce qu'elles font, mais aucunes idées.
    Google est ton ami : "Résultats 1 - 10 sur un total d'environ 144 000 pour va_arg. (0,34 secondes) "

    http://membres.lycos.fr/dancel/c/c70_140.htm

  4. #4
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut Re: va_arg, va_start, va_end, que font ces fonctions???
    Bonjour,

    man va_arg

  5. #5
    Membre habitué Avatar de richard_sraing
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Avril 2005
    Messages
    483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Avril 2005
    Messages : 483
    Points : 182
    Points
    182
    Par défaut
    Oui d'accord,

    mais est ce que l'on pourrait m'envoyer un exemple avec la fonction appelante.

    Car la je vois que l'on me donne des choses du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    #include <stdio.h>
    #include <stdarg.h>
     
    void error(const char *fmt, ...)
    {
       va_list argp;
       fprintf(stderr, "error: ");
       va_start(argp, fmt);
       vfprintf(stderr, fmt, argp);
       va_end(argp);
       fprintf(stderr, "\n");
    }
    mais je ne sais pas ce que l'on pase comme paramètres à la fonction quand on l'appel.

    Si je voyait ce que prend la fonction comme paramètre, je pourrait dire que je comprend, mais la je ne sais pas pourquoi dans le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    #include <stdio.h>
    #include <stdarg.h>
     
    void 
    foo (char *fmt, ...)
    {
      va_list ap;
      int     d;
      char    c, *p, *s;
     
      va_start  (ap, fmt);
      while     (*fmt)
        switch  (*fmt ++) {
          case 's': /* chaîne */
            s = va_arg (ap, char *);
            printf ("chaine %s\n", s);
            break;
          case 'd':  /* entier */
            d = va_arg (ap, int);
            printf ("int %d\n", d);
            break;
          case 'c': /* caractère */
            c = va_arg (ap, char);
            printf ("char %c\n", c);
            break;
        }
      va_end (ap);
    }
    on fait "d = va_arg(ap, int);", si je savais de quel type de variable il s'agit à la base et en quel position il se trouve le passage de paramètre, ça irait mieux. Merci de votre compréhension.

  6. #6
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Une fonction variadic s'utilise exactement comme printf (et sa famille) qui est... une fonction variadic !
    Evidemment, il est possible d'avoir besoin de connaitre le type des arguments passés. printf() le fait en analysant la chaine de caractere décrivant le format souhaité. On peut choisir d'autres méthodes (flags codés, par exemple).

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Que font ces codes JQuery ?
    Par boobs60 dans le forum jQuery
    Réponses: 1
    Dernier message: 30/05/2012, 21h03
  2. que font ces commandes ?
    Par sab_info dans le forum Shell et commandes GNU
    Réponses: 7
    Dernier message: 07/04/2008, 10h58
  3. Que font ces fonctions ?
    Par lougia dans le forum C
    Réponses: 1
    Dernier message: 03/05/2007, 12h09
  4. [Conception] Que fait ma fonction ?
    Par Tr@nkill dans le forum PHP & Base de données
    Réponses: 15
    Dernier message: 28/04/2006, 16h03
  5. [xsl] que sont ces nodes?
    Par luta dans le forum XSL/XSLT/XPATH
    Réponses: 11
    Dernier message: 10/11/2005, 18h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo