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 :

Utilisation de va_list


Sujet :

C

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 9
    Points : 8
    Points
    8
    Par défaut Utilisation de va_list
    Bonjour,

    Je souhaiterais utiliser dans plusieurs fonctions différentes une liste variable de paramètres. Afin de rendre le code plus souple, j'ai une première fonction qui donne une référence sur la liste variable de paramètres:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    va_list InitList(int aNb, ...)
    {
    	va_list aL;
    	va_start(aL, aNb);
     
    	return (aL);
    }
    J'ai par ailleurs une fonction à laquelle je souhaite faire passer un nombre variable de paramètres, soit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    double the_Func(va_list aL)
    {
    	double aC = va_arg(aL, double);
     
    	printf("%f\n", aC);
    }
    Dans mon programme principal, je fais l'appel suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    va_list aL = InitList(1, 100.0);
    the_Func(aL);
    va_end(aL);
    Malheureusement, le résultat produit n'est pas celui escompté. La fonction the_Func n'affiche jamais 100. En mode debug, je me suis rendu compte que le pointeur aL au sein de la fonction the_Func n'avait pas la même valeur qu'en dehors de cette fonction.

    Si quelqu'un a une solution à mon problème, je suis preneur.
    Je remercie par avance les personnes qui me feront une réponse.

    Stochastic.

  2. #2
    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 : 67
    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: Utilisation de va_list
    Citation Envoyé par Stochastic
    Je souhaiterais utiliser dans plusieurs fonctions différentes une liste variable de paramètres. Afin de rendre le code plus souple, j'ai une première fonction qui donne une référence sur la liste variable de paramètres:
    Huh ! Je n'ai jamais entendu parlé de cette façon d'utiliser les va_list...

    Mais ça a l'air de fonctionner :
    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
     
    /* main.c */
    #include <stdarg.h>
    #include <stdio.h>
     
    static va_list InitList(int aNb, ...)
    {
       va_list aL;
       va_start(aL, aNb);
     
       return aL;
    }
     
    static void the_Func(va_list aL)
    {
       double aC = va_arg(aL, double);
     
       printf("%f\n", aC);
    }
     
    int main (void)
    {
       va_list aL = InitList(1, 100.0);
       the_Func(aL);
       return 0;
    }
    Pas de Wi-Fi à la maison : CPL

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 9
    Points : 8
    Points
    8
    Par défaut
    Je vous remercie pour votre réponse. Mais je ne vois pas trop la différence avec mon code précédent, mis à part la syntaxe "static". Est-ce elle qui permet de faire tourner le programme?

    Par ailleurs, le code produit toujours 0.0 sur mon poste !?

  4. #4
    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 : 67
    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
    Citation Envoyé par Stochastic
    Je vous remercie pour votre réponse. Mais je ne vois pas trop la différence avec mon code précédent, mis à part la syntaxe "static". Est-ce elle qui permet de faire tourner le programme?

    Par ailleurs, le code produit toujours 0.0 sur mon poste !?
    Il est possible que ce code ne soit pas pas portable. J'avoue mon incompétance.
    Pas de Wi-Fi à la maison : CPL

  5. #5
    zul
    zul est déconnecté
    Membre éclairé Avatar de zul
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    498
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 498
    Points : 699
    Points
    699
    Par défaut
    D'apres la man page de debian a ce sujet
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     An obvious implementation would have a va_list  be  a  pointer  to  the
           stack frame of the variadic function.
    Dans ce cadre la, quand on sort de la fonction, la stack frame de la fonction est envolé, et ton pointeur pointe dans le vent.

    Le même man indique

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     Each invocation of va_start() must be matched by a corresponding  invo-
           cation  of va_end() in the same function
    ce qui te laisse peu de chance de faire ce que tu veux faire.

    Quand à la norme, elle ne semble rien dire a ce sujet. Peut-etre peut on s'en sortir avec va_copy mais je ne suis pas sur.

Discussions similaires

  1. utilisation avancée va_list
    Par hwoarang dans le forum C++
    Réponses: 6
    Dernier message: 15/08/2008, 19h40
  2. utilisation de va_list
    Par Joccy dans le forum C
    Réponses: 7
    Dernier message: 08/04/2008, 11h29
  3. Réponses: 8
    Dernier message: 29/03/2007, 11h16
  4. utilisation du meta type ANY
    Par Anonymous dans le forum CORBA
    Réponses: 1
    Dernier message: 15/04/2002, 12h36
  5. Réponses: 2
    Dernier message: 20/03/2002, 23h01

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