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 :

macro _INTSIZEOF (utilisée dans va_start et va_arg)


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Biosox
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 298
    Par défaut macro _INTSIZEOF (utilisée dans va_start et va_arg)
    Bonjour.
    J'essaie de comprendre le fonctionnement des macros va_start, va_arg et va_end, utilisées pour faire des fonctions dont le nombre de paramètres est variable.
    On a:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    #define _INTSIZEOF(n)   ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )
     
    #define va_start(ap,v)  ( ap = (va_list)&v + _INTSIZEOF(v) )
    #define va_arg(ap,t)    ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )
    #define va_end(ap)      ( ap = (va_list)0 )
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef char *  va_list;
    Si je comprend l'idée:
    1/ On initialise un pointeur "ap" (char* ap), vers le premier argument "inconnu" de la fonction, avec va_start.

    2/ Ensuite, on parcourt les arguments en faisant "avancer le pointeur dans la pile" en bouclant va_arg

    3/ quand on a fini, on fait un p'tit va_end, juste pour remettre le pointeur à NULL. C'est plus propre.


    Mais il y a certaines choses que je ne comprend pas:
    A. La macro _INTSIZEOF. A quoi sert-elle?
    J'ai testé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    	int intsizeof;
    	char	c;
    	int		i;
    	double  d;
     
    	intsizeof =	_INTSIZEOF(c); // <-- on obtient 4
    	intsizeof =	_INTSIZEOF(i); // <-- on obtient 4
    	intsizeof =	_INTSIZEOF(d); // <-- on obtient 8
    Est-ce que c'est la taille que prend un argument passé en paramètre (posé sur la pile)?

    B. Si c'est ça, je comprend bien la macro va_start(ap,v) (on fait pointer ap, derrière v, donc à "l'adresse de v + taille de v sur la pile", mais pas la macro va_arg(ap,t)?
    Pour moi, ça suffirait de faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define va_arg(ap,t)    ( *(t *)((ap += _INTSIZEOF(t)) )
    (on retourne un élément de type t, pointé par ap, puis on incrémente ap de la taille de cet élément.

    C. Enfin, last but not least, dans les exemple que je trouve, la fonction s'attend à trouver un élément "marqueur de fin". (par exemple, la fonction fait une somme d'entier, en bouclant va_arg jusqu'à trouver un paramètre qui vaut 0, ou -1 p.ex)
    Existe-t'il un moyen de faire autrement que de définir un marqueur de fin?

    Merci de votre aide,
    Biosox

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    1. oui, ou proche de oui. Je ne connais pas les détails, mais c'est dans ces eaux-là
    2. Il doit y avoir des problèmes d'alignement dans certains trucs, notamment au niveau de l'endianness (le char ne sera pas au même endroit dans un paramètre 32bits selon l'architecture)
    3. Marqueur de fin ou indicateur de taille... Dans printf/vprintf, c'est le format qui indique où finissent les arguments et quel est leur type...


    PS: pour faire des fonctions avec des arguments variables, je recommande d'en faire toujours deux versions : Une avec "..." pour la facilité d'utilisation (facultative), et une avec une va_list (obligatoire). Le tout forme un couple, comme printf() et vprintf().
    Et question implémentation, celle avec "..." est un simple wrappper de celle avec une va_list.

    La raison, c'est qu'on ne peut faire de wrapper qu'avec une va_list.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Expert éminent
    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
    Par défaut
    Citation Envoyé par Biosox
    Bonjour.
    J'essaie de comprendre le fonctionnement des macros va_start, va_arg et va_end, utilisées pour faire des fonctions dont le nombre de paramètres est variable.
    On a:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    #define _INTSIZEOF(n)   ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )
    C'est pas bien de regarder sous les jupes des filles. Tu pourrais y voir le Diable !

    Ouvre plutôt ton K&R au chapître 'variadics'...

  4. #4
    Membre éclairé Avatar de Biosox
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 298
    Par défaut
    @Medinoc: Merci beaucoup pour ces précisions

    @Emmanuel:
    Citation Envoyé par Emmanuel Delahaye
    C'est pas bien de regarder sous les jupes des filles. Tu pourrais y voir le Diable !

    Ouvre plutôt ton K&R au chapître 'variadics'...
    Eh ben on a pas du regarder sous les jupes des mêmes filles, parce que moi c'est pas le diable que j'y ai vu

    Sinon j'ai pas le K&R..., j'ai la "bible du programmeur".

    Enfin c'est le mot-clé "variadics" qui me manquait. Je vais continuer mes recherches. Merci

    P.S: si je regarde sous les jupes des filles c'est justement parce que je ne cherche pas à faire une fonction variadique, j'en ai même pas besoin. Je cherche juste à connaitre le mécanisme.

  5. #5
    Expert éminent
    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
    Par défaut
    Citation Envoyé par Biosox
    P.S: si je regarde sous les jupes des filles c'est justement parce que je ne cherche pas à faire une fonction variadique, j'en ai même pas besoin. Je cherche juste à connaitre le mécanisme.
    C'est pour ça qu'il faut apprendre à te servir des macros va_xxx() de <stdarg.h>, mais pas à les décortiquer. Ca ne t'apportera rien.

    http://publib.boulder.ibm.com/infoce...f2/varargs.htm
    http://publications.gbdirect.co.uk/c...r9/stdarg.html

  6. #6
    Membre éclairé Avatar de Biosox
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 298
    Par défaut
    Merci pour ces précisions, et ces liens utiles.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 16/02/2012, 14h37
  2. Réponses: 1
    Dernier message: 23/12/2009, 11h50
  3. [XL-2003] Macro pour utiliser des données Excel dans un document Word
    Par Jeremy0269 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 22/07/2009, 18h58
  4. VBA Macro utilisable dans un dossier ciblé / Bouton personnalisé
    Par pythagore3_14 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 31/07/2008, 08h35
  5. nommage de cellule et utilisation dans macro
    Par tritri38 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 14/04/2006, 16h56

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