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 à nb de paramètres variables


Sujet :

C

  1. #1
    Membre averti
    Inscrit en
    Janvier 2005
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 55
    Par défaut Fonction à nb de paramètres variables
    Bonsoir,

    J'aimerais faire une fonction qui possède un nombre de paramètres variables, mais en ne précisant d'aucune façon une indication sur le nombre de paramètres supplémentaires passés.

    Je ne crois pas que cela soit possible, toutes les fonctions que j'ai vu utilisent un mécanisme pour indiquer combien de paramètres vont être passés.

    le prototype de ma fonction serait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void arbreBinaire_iterer(arbreBinaire self, void (*fonction)(void*) [, int indiceDebut [, int itererDescendance]]);
    Cela est-il possible ?

    Je vous remercie.

    Sources :
    http://membres.lycos.fr/dancel/c/c70_140.htm
    http://www.developpez.net/forums/sho...hlight=va_list
    http://publications.gbdirect.co.uk/c...r9/stdarg.html

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 392
    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 392
    Par défaut
    Comme dit Raymond Chen, "Imagine si c'était possible".

    Comment la fonction saurait-elle si on lui a passé tel paramètre ou non ?

    Le mieux que tu puisses faire, c'est une fonction à nombre de paramètres variables, avec un mécanisme indiquant combien de paramètres sont passés (Un compteur, un format façon printf()/scanf(), une valeur sentinelle, etc.)
    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 Neal Morse Voir le message
    J'aimerais faire une fonction qui possède un nombre de paramètres variables, mais en ne précisant d'aucune façon une indication sur le nombre de paramètres supplémentaires passés.
    C'est pas possible. Il faut utiliser le prototype prévu qui est :
    et les fonctions de <stdarg.h>.

    On peut éventuellement utiliser un mécanisme de sentinelle si les données le permettent... il est néanmoins préférable d'utiliser le paramètre format pour préciser ses intentions... C'est fait pour.

  4. #4
    scr
    scr est déconnecté
    Membre éprouvé
    Inscrit en
    Juin 2005
    Messages
    127
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 127
    Par défaut
    Pourrait-on savoir en quoi consiste ce mécanisme de sentinelle ?

  5. #5
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 392
    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 392
    Par défaut
    Le genre de mécanisme utilisé dans des fonctions comme la fonction POSIX execl() : Tous les paramètres finaux sont des pointeurs, le dernier est NULL.
    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.

  6. #6
    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 scr Voir le message
    Pourrait-on savoir en quoi consiste ce mécanisme de sentinelle ?
    C'est le principe de la chaine C : on ajoute un élément signifiant 'fin de liste' à la fin de la liste. Le paramètre format prend une valeur quelconque, car il n'est pas utilisé (mais obligatoire) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    n = somme (0, 1,2 3,4,0); /* 0 est la sentinelle */
    affichage (NULL, "Hello", "World", NULL); /* NULL est la sentinelle */
    avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    int somme (int fmt, ...);
    void affichage (char const *fmt, ...);

  7. #7
    scr
    scr est déconnecté
    Membre éprouvé
    Inscrit en
    Juin 2005
    Messages
    127
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 127
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Le genre de mécanisme utilisé dans des fonctions comme la fonction POSIX execl() : Tous les paramètres finaux sont des pointeurs, le dernier est NULL.
    Merci

  8. #8
    scr
    scr est déconnecté
    Membre éprouvé
    Inscrit en
    Juin 2005
    Messages
    127
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 127
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    on ajoute un élément signifiant 'fin de liste' à la fin de la liste. Le paramètre format prend une valeur quelconque, car il n'est pas utilisé (mais obligatoire) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    n = somme (0, 1,2 3,4,0); /* 0 est la sentinelle */
    affichage (NULL, "Hello", "World", NULL); /* NULL est la sentinelle */
    avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    int somme (int fmt, ...);
    void affichage (char const *fmt, ...);
    Merci

  9. #9
    Membre averti
    Inscrit en
    Janvier 2005
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 55
    Par défaut
    Merci.

    Médinoc > ma réponse va peut-être te paraître stupide, mais avant de faire du C je faisais du PHP et ce mécanime existe.

    Bonne soirée

  10. #10
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 392
    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 392
    Par défaut
    PHP est un langage de haut niveau.
    C et C++ sont des langages [de ]brut[e]s.
    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.

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

Discussions similaires

  1. Fonction à nombre de paramètres variable
    Par Noufnouf dans le forum Scheme
    Réponses: 1
    Dernier message: 06/04/2011, 11h01
  2. Réponses: 6
    Dernier message: 30/10/2007, 12h27
  3. Réponses: 2
    Dernier message: 05/09/2007, 09h22
  4. Réponses: 11
    Dernier message: 30/03/2006, 15h39
  5. Réponses: 5
    Dernier message: 09/02/2005, 18h50

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