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 :

Utiliser un tableau comme liste d'arguments variable


Sujet :

C

  1. #1
    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 Utiliser un tableau comme liste d'arguments variable
    Bonjour,

    Est-ce que ce code est portable :
    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
    #include <stdio.h>
    #include <stdarg.h>
     
    static void foo_va (int nb, va_list ap)
    {
      printf ("%d : ", nb);
      for (int i = 0; i < nb; i++)
      {
        const char *x = va_arg (ap, const char *);
     
        printf ("%s, ", x);
      }
      printf ("\n");
    }
     
    int main (void)
    {
      const char *tab[3] = {"test", "toto", "titi"};
     
      foo_va (3, (va_list)tab);
      return 0;
    }
    Sachant que ce code est prévu pour fonctionner uniquement avec des pointeurs de char.

    Merci d'avance

  2. #2
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Non. Il n'y a a ma connaissance aucun moyen de faire ce que tu veux.

  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 : 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 gege2061
    Sachant que ce code est prévu pour fonctionner uniquement avec des pointeurs de char.
    Qu'est-ce qui ne va pas avec :
    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
     
    #include <stdio.h>
     
    static void foo_va (size_t nb, char const **pp)
    {
       size_t i;
       printf ("%lu : ", (unsigned long) nb);
       for (i = 0; i < nb; i++)
       {
          const char *x = pp[i];
     
          printf ("%s, ", x);
       }
       printf ("\n");
    }
     
    int main (void)
    {
       const char *tab[3] = { "test", "toto", "titi" };
     
       foo_va (sizeof tab / sizeof *tab, tab);
       return 0;
    }
    Trop simple ?

  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
    Citation Envoyé par Emmanuel Delahaye
    Qu'est-ce qui ne va pas avec :
    [...]
    Trop simple ?
    Oui ça doit être ça

    En fait c'est pour avoir deux possibilités pour spécifier un chemin de recherche (qui correspond à des balises d'un fichier XML) :
    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 <stdarg.h>
     
    void object_foo_va (object_s *this, va_list ap)
    {
    }
     
    void object_foo_from_path (object_s *this, const char *path)
    {
      char ap = str_split (path, "/");
      object_foo_va (this, ap);
      free (ap);
    }
     
    void object_foo (object_s *this, ...)
    {
      va_list ap;
     
      va_start (this, ap);
      object_foo_va (this, ap);
      va_end (ap);
    }
     
    int main (void)
    {
      /* ... */
      object_foo (this, "chemin", "quelconque", NULL);
      /* ou */
      object_foo_from_path (this, "/chemin/quelconque");
    }
    Citation Envoyé par Jean-Marc.Bourguet
    Non. Il n'y a a ma connaissance aucun moyen de faire ce que tu veux.
    C'est dommage ça marchais bien à première vue

    Merci pour vos réponses

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    On ne peut pas créer dynamiquement une va_list.
    Si l'on veut invoquer dynamiquement une fonction, il faut utiliser son propre système, car va_list n'est pas compatible.
    Généralement, comme le montre Emmanuel, on utilise un tableau de chaînes (c'est ce que fait tclcl). COM/OLE utilise des VARIANT pour ses appels dynamiques.

    Quant aux appels statiques, le mieux est une vraie fonction à nombre d'arguments variables utilisée comme wrapper de la fonction va_list (comme ici par exemple).

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 15/08/2012, 10h37
  2. [VxiR2] Utiliser une invite de liste dans une variable
    Par erwann_ dans le forum Deski
    Réponses: 3
    Dernier message: 21/02/2012, 15h29
  3. Utilisation de variable dans une liste d'arguments
    Par bk313142 dans le forum Général JavaScript
    Réponses: 16
    Dernier message: 27/12/2009, 18h51
  4. Est-il possible d'utiliser la fonction TOP avec un argument variable ?
    Par 16-Marco dans le forum Requêtes et SQL.
    Réponses: 13
    Dernier message: 06/03/2007, 22h21
  5. [débutant] utiliser un tableau comme une frameset
    Par toudoux dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 09/02/2006, 09h16

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