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 :

determiner un nombre d'arguments


Sujet :

C

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    289
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2006
    Messages : 289
    Par défaut determiner un nombre d'arguments
    Salut a tous,

    imaginons que je declare un fonction comme ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int  mafonction(char *s, ...)
    et lorsque j'appel ma fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mafonction("test", "toto", "titi")
    comment determiner qu'il y a deux arguments

  2. #2
    Membre Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Par défaut
    On ne peut pas directement. Il faut envoyer le nombre d'arguments à la fonction, explicitement ou non (cf. le specificateur de format de printf()) ou se servir d'un argument "balise" pour signaler la fin des arguments (NULL, par exemple).

  3. #3
    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
    Par défaut
    Citation Envoyé par DaZumba
    On ne peut pas directement. Il faut envoyer le nombre d'arguments à la fonction, explicitement ou non (cf. le specificateur de format de printf()) ou se servir d'un argument "balise" pour signaler la fin des arguments (NULL, par exemple).
    ça y ai je viens de réussir à utiliser un code que j'avais trouvé sur comp.std.c (il m'a fallu presque une année ) :
    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    #include <stdio.h>
    #include <stdarg.h>
     
    /* The PP_NARG macro returns the number of arguments that have been
      * passed to it.
      */
     
    #define PP_NARG(...) \
             PP_NARG_(__VA_ARGS__,PP_RSEQ_N())
    #define PP_NARG_(...) \
             PP_ARG_N(__VA_ARGS__)
    #define PP_ARG_N( \
              _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,_30, \
             _31,_32,_33,_34,_35,_36,_37,_38,_39,_40, \
             _41,_42,_43,_44,_45,_46,_47,_48,_49,_50, \
             _51,_52,_53,_54,_55,_56,_57,_58,_59,_60, \
             _61,_62,_63,N,...) N
    #define PP_RSEQ_N() \
             63,62,61,60,                   \
             59,58,57,56,55,54,53,52,51,50, \
             49,48,47,46,45,44,43,42,41,40, \
             39,38,37,36,35,34,33,32,31,30, \
             29,28,27,26,25,24,23,22,21,20, \
             19,18,17,16,15,14,13,12,11,10, \
             9,8,7,6,5,4,3,2,1,0
     
    #define FOO(...) foo (PP_NARG(__VA_ARGS__), __VA_ARGS__)
     
    static void foo (int nb, ...)
    {
      va_list ap;
     
      printf ("%d : ", nb);
      va_start (ap, nb);
      for (int i = 0; i < nb; i++)
      {
        char *x = va_arg (ap, char *);
     
        printf ("%s, ", x);
      }
      va_end (ap);
      printf ("\n");
    }
     
    int main (void)
    {
      FOO ("test", "toto", "titi");
      FOO ("test", "toto", "titi", "tata");
    	return 0;
    }
    /* Note: using PP_NARG() without arguments would violate 6.10.3p4 of ISO C99. */
    Code x : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3 : test, toto, titi,
    4 : test, toto, titi, tata,

    Je ne connais pas les limites en terme de portabilité de ce genre de chose

  4. #4
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    C99

  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 Pitou5464
    Salut a tous,

    imaginons que je declare un fonction comme ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int  mafonction(char *s, ...)
    et lorsque j'appel ma fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mafonction("test", "toto", "titi")
    comment determiner qu'il y a deux arguments
    Soit l'indication est dans le premier paramètre (c'est le mécanisme prévu par le langage C) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mafonction(2, "toto", "titi")
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mafonction("2", "toto", "titi")
    etc. soit, puisqu'on a affaire à des pointeurs, tu peux marquer la fin de la liste avec NULL : Dans ce cas, le 1 er paramètre (qui est obligatoire), n'est pas utilisé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mafonction(0, "toto", "titi", (char*) NULL)
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mafonction(NULL, "toto", "titi", (char*) NULL)
    Nota : S'agissant d'une fonction variadic, le cast est obligatoire pour être portable.

  6. #6
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    Sinon, je crois qu'on peut s'amuser à analyser la pile "à la main", avec un bloc d'assembleur. Totalement pas portable

  7. #7
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par Gruik
    Sinon, je crois qu'on peut s'amuser à analyser la pile "à la main", avec un bloc d'assembleur. Totalement pas portable
    Il me faudrait des détails parce que je ne vois pas comment c'est possible en général (un système donné peut utiliser une ABI qui le rende possible, mais je ne suis même pas sûr que ce soit courant -- il ne me semble pas que ce soit possible avec les ABI que j'ai regardée mais je peux me tromper).

  8. #8
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    Oui désolé, je dis des conneries, j'avais cru comprendre que c'était possible. On pourrait avoir la taille totale des paramètres passés, mais si on a pas leur type (la taille de leur type), ça sert à rien

Discussions similaires

  1. Determiner le Nombre de sections dans un ini
    Par gilles641 dans le forum Langage
    Réponses: 1
    Dernier message: 09/08/2005, 15h07
  2. Macros et nombre d'arguments variable
    Par kaisse dans le forum C
    Réponses: 7
    Dernier message: 28/07/2005, 10h10
  3. Nombre d'arguments variable
    Par gege2061 dans le forum C
    Réponses: 7
    Dernier message: 05/08/2004, 15h43
  4. UNION de deux SELECT avec nombre d'arguments différents
    Par orus8 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 16/07/2004, 14h32
  5. determination le nombre de ligne d'une table
    Par picoti2 dans le forum Bases de données
    Réponses: 2
    Dernier message: 18/03/2004, 09h25

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