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 :

stdarg.h va_list et parametres


Sujet :

C

  1. #1
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2011
    Messages : 15
    Par défaut stdarg.h va_list et parametres
    Bonjour,

    Il y a quelque temps, je suis tombe sur un manual dans lequel il etait explique qu'il etait possible de passer un va_list (ou va_list*, ma memoire fait defaut) a une fonction normale afin de lui passer les arguments voulus.

    Typiquement:
    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
     
    #include <stdio.h>
    #include <stdarg.h>
    void foo(const char *s, int i) // on passerait donc un va_list au lieu de ces parametres
    {
     printf("%s - %d\n", s, i);
    }
     
    void bar(void (*f)(va_list), ...)
    {
     va_list ap;
     va_start(ap, f);
     f(ap);
     va_end(ap);
    }
    int main(void)
    {
     bar(foo, "i am a string", 42);
     return 0;
    }
    Je en me souviens plus ou j'avais vu cela, et je n'arrive pas a retrouver quoi que ce soit dessus.

    L'idee de base est que l'on peut transformer une liste de parametres en un va_list, du coup il devrait etre posible de retourner le processus.

    si vous disposez d'informations relative a ce sujet, n'hesitez pas a repondre!

  2. #2
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Bonjour,

    Tout en haut à droite, tu as une fonction de recherche sur developpez, si tu tape man <nom> tu trouves le man de ce que tu recherches :
    http://man.developpez.com/man3/stdarg.3.php

  3. #3
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2011
    Messages : 15
    Par défaut
    je sais cela, merci si je pose ma question c'est que je suis déjà passe par la case man

  4. #4
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Citation Envoyé par Jobozzo Voir le message
    je sais cela, merci si je pose ma question c'est que je suis déjà passe par la case man
    Tu veux bien transformer un va_list en liste de paramètre non?

  5. #5
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2011
    Messages : 15
    Par défaut
    en substance oui, j'aimerais que la fonction appelee ne puisse pas savoir qu'elle l'a ete avec un va_list plutot qu'avec un appel normal...

    Si ce cas precis est dans le man, je m'excuse de suite et vais apprendre a lire

  6. #6
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Citation Envoyé par Jobozzo Voir le message
    en substance oui, j'aimerais que la fonction appelee ne puisse pas savoir qu'elle l'a ete avec un va_list plutot qu'avec un appel normal...

    Si ce cas precis est dans le man, je m'excuse de suite et vais apprendre a lire
    Partie exemple du man.

  7. #7
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2011
    Messages : 15
    Par défaut
    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
    29
     
    #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);
    }
    tu parles bien de ca ?

    si c'est le cas, alors non ca ne repond pas a ma problematique, ca explique juste var_arg...


    le bout de code que j'avias vu passait la va_list sans la decomposer

  8. #8
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Je suis en train de demander sur le chat, mais à part la proposition de LittleWhite d'utiliser vprintf (lien dans la partie bogue de va_list) on ne trouve pas grand chose.

  9. #9
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2011
    Messages : 15
    Par défaut
    ho tu as carrement demande sur le chat? merci!
    il faudrait absolument que je retrouve ce man, mais c'etait un document assez long en anglais, et je n'y avais pas prete attention a ce moment la car j'avais d'autres idees d'implementation en tete

  10. #10
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Si je comprends bien ce que tu veux, c'est pas possible de manière standard et il faut se tourner vers qqch comme http://sourceware.org/libffi/

  11. #11
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2011
    Messages : 15
    Par défaut
    En fait, je ne comprned pas trop pourquoi cette pratique n'est pas plus developpee, car en substence, tout ce que fait va_start c,est recuperer la stack a partir du dernier element connu (donc le premier, en regle generale) puis va_arg recupere un segment de cette copie de taille ,type, donc je ne vois pas pourquoi il serait impossible de repasser cette copie de stack a une autre fonction a l,appel... peut-etre qu,au niveau de ,asm inline?

    Je vais allez voir du cote des forums us, merci

  12. #12
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 450
    Par défaut
    Hello,

    Citation Envoyé par Jobozzo Voir le message
    tout ce que fait va_start c,est recuperer la stack a partir du dernier element connu (donc le premier, en regle generale) puis va_arg recupere un segment de cette copie de taille ,type, donc je ne vois pas pourquoi il serait impossible de repasser cette copie de stack a une autre fonction a l,appel... peut-etre qu,au niveau de ,asm inline ?
    Je ne suis pas sûr d'avoir compris entièrement ce que tu cherches à faire mais va_arg ne fait pas de copie de la pile. À dire vrai, les arguments dans la pile, lorsqu'ils y sont (on peut faire certaines optimisations en les passant directement dans les registres du processeur), sont déposés tels quels sans forme de structure particulière. C'est le prototype de la fonction qui, à la compilation, permet de savoir quels seront leurs types et à quels endroits ils se trouveront.

    va_start() ne fait que récupérer l'adresse du premier argument et se pointer juste après parce qu'il en connaît le type et donc la longueur en mémoire. va_arg() fait de même en te faisant confiance. Ça veut dire aussi que va_list n'est en fait qu'un ensemble de pointeurs qui te permet de savoir où tu en es dans la lecture.

    Lorsque tu fais va_arg(), tu indiques à la fois la liste et le type de l'argument à récupérer. C'est donc une macro qui, en substance, va faire un transtypage du pointeur courant vers le type que tu lui indiques, récupérer la donnée de ce format et faire avancer le pointeur d'autant. Ça veut donc dire que, non seulement, ni le compilateur, ni l'exécutable final ni même la CRT ne savent ce qui se trouve réellement dans la pile et que, d'autre part, si tu te trompes de type lorsque tu fais un va_arg, ton programme n'a aucun moyen de le savoir.

    C'est pour cela, entre autres, que printf() utilise le fonctionnement qu'on lui connaît, à savoir le format intégral de la chaîne dans le premier argument, sur lequel on s'appuie pour aller chercher les suivants.

    Vois également cette discussion qui traitait du même cas :
    http://www.developpez.net/forums/d12...-sous-windows/

Discussions similaires

  1. [VBA-W] [AUTOMATION]Liste Fonctions/Paramètres
    Par Sunny dans le forum VBA Word
    Réponses: 2
    Dernier message: 05/12/2002, 16h35
  2. [VB6] Transférer ".picture" en paramètre
    Par Ricou13 dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 19/11/2002, 08h43
  3. [VB6] [ADO] Procedure stockée : spécifier les paramètres
    Par adepdoom dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 16/10/2002, 10h45
  4. Passage de parametre a une anim Flash 5
    Par debug dans le forum Intégration
    Réponses: 4
    Dernier message: 03/06/2002, 17h59
  5. transmision de tableau en parametre
    Par Horus dans le forum C++Builder
    Réponses: 3
    Dernier message: 16/05/2002, 11h15

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