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 :

Fonction avec un nombre non finit de paramettre.


Sujet :

C++

  1. #1
    Membre régulier Avatar de Groove
    Inscrit en
    Décembre 2002
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 97
    Points : 93
    Points
    93
    Par défaut Fonction avec un nombre non finit de paramettre.
    Bonjours,

    Je voudrais ecrire une fonction de la manière de la fonction printf ();

    Avec printf () on peut mettre le nombre de parametres que l'on veut et je voudrais savoir comment déclarer une fonction de ce type ( si c'est possible) et comment utiliser les parametres.

  2. #2
    Membre confirmé
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Mars 2006
    Messages
    400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Mars 2006
    Messages : 400
    Points : 562
    Points
    562
    Par défaut
    Pour créer une fonction avec un nombre variable d'arguments, il faut utiliser ce qui s'appelle une "va_list".

    Pour déclarer une fonction comme pouvant attendre un nombre variable d'arguments, il faut ajouter ... (3 points) à la fin.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    // exemple :
    void fonction(char* text,...);
    Dans le code de la fonction, il faut d'abord créer une va_list qui va permettre d'accéder aux paramètres de la fonctions.
    La va_list est initialisée avec la macro va_start.

    A la fin de la fonction, la va_list doit être fermée à l'aide de la macro va_end.

    Pour transmette les arguments d'une telle fonction à une fonction printf, il faut utiliser la version de printf utilisant les va_list.
    En pratique, il suffit de rajouter un v devant le nom de la fonction :
    - printf devient vprintf
    - fprintf devient vfprintf
    - etc...

    Voici maintenant un exemple de fonction avec nombre variable d'arguments.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    // exemple de fonction type printf :
    // file est une variable de type FILE*
    void fonction(char* text,...)
    {
      va_list argList;
      va_start(argList,text);
      vfprintf(file,text,argList);
      va_end(argList);
    }

  3. #3
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    La solution la plus classique en C++ est sûrement la chaînage de fonctions, comme par exemple l'opérateur << sur les ostreams. En gros :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class C
    {
      C& f(int);
      C& f(char);
    };
     
    C c;
    c.f(42).f('z').f(1).f(2).f(3);
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  4. #4
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Accessoirement, les fonctions à ellipse (...) n'acceptent pas des types complexes. Adieu les string et autres objets passés par référence/valeur -- ou alors bonjour coredump.
    J'ai une énorme préférence pour les chaînages d'appel. Qui peuvent permettre d'écrire des trucs comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    const std::string chaine3 = "titi";
    LOGGER::instance() -> log(NiveauDeLog, "format %1 toto %3 %2")
       % "chaine" % 42 % chaine3;
    Qui logguera:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    format chaine toto titi 42
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

Discussions similaires

  1. Réponses: 36
    Dernier message: 15/05/2013, 13h44
  2. Réponses: 3
    Dernier message: 23/08/2007, 00h39
  3. Réponses: 7
    Dernier message: 19/05/2006, 16h47
  4. Réponses: 6
    Dernier message: 10/08/2005, 11h36
  5. Une fonction avec des attributs non obligatoires
    Par YanK dans le forum Langage
    Réponses: 5
    Dernier message: 15/11/2002, 13h39

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