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 :

Appel de fonction à nombre inconnu d'arguments !


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 40
    Points : 16
    Points
    16
    Par défaut Appel de fonction à nombre inconnu d'arguments !
    Bonjour à tous.

    Dans le cadre d'un projet systeme, je suis confronté à un petit souci...

    Je dois en effet implanter des plugins qui permettront de faire des opérations sur une pile. L'utilisateur entrera donc ses commandes: exemple: "empiler a". Le programme deva donc ajouter l'élément a en sommet de pile.
    Mais évidemment, selon le plugin, le nombre d'arguments varie. Alors je ne vois pas trop comment appeler mon plugin (au sein de la boucle de saisie de commandes), étant donné que le nombre d'argument n'est pas forcément le meme pour tous les plugins. Je ne vois pas non plus cmt gérer les erreurs du type: un int a été envoyé en argument à la place d'un .. char par exemple!

    si quelqu'un pouvait éclairer ma lanterne ... reconnaissance infinie assurée!

    merci d'avance,
    L.

  2. #2
    Membre expérimenté
    Avatar de granquet
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    1 201
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 201
    Points : 1 421
    Points
    1 421
    Par défaut
    bah, pourquoi pas passer une structure avec un enum qui donneras le type de donnée et un pointeur (void *) vers une structure representant l'element?
    apres dans tes fonctions ... tu te debrouille avec ton enum pour savoir quoi faire de ton pointeur.

  3. #3
    Membre expérimenté
    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
    Points : 1 729
    Points
    1 729
    Par défaut
    Salut

    Tu peux peut être définir un nombre max d'arguments et les "commandes" auront un certain nombre d'arguments valorisés.
    Pour le type des arguments, si c'est saisi par l'utilisateur, on peut etre sûr du fait que ce sont toujours des chaines (qui representent peut être des entiers ou des caracteres uniques ou des flottants, mais qui sont quand meme des chaines à la base)

  4. #4
    Membre expérimenté
    Avatar de granquet
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    1 201
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 201
    Points : 1 421
    Points
    1 421
    Par défaut
    si c'est des chaines de caractere, tu peux "lineariser" (je suis pas sur du terme) les arguments : fonction(int argc,char *argv[]) (ca devrais rappeler quelque chose )

    dans les solutions "usines a gaz" t'as aussi la possibilité d'utiliser les va_args.

  5. #5
    Membre habitué Avatar de nicolas66
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    326
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 326
    Points : 146
    Points
    146
    Par défaut
    Pour ma part, j'ai déjà utilisé les 'va_args' dans le cadre d'un TP et je peux dire que ca fonctionne bien. Mais c'est un peu lourd à utiliser ...


    Nico.

  6. #6
    Membre éclairé Avatar de HanLee
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2004
    Messages : 738
    Points : 871
    Points
    871
    Par défaut
    Citation Envoyé par Dark_Ebola
    si c'est des chaines de caractere, tu peux "lineariser" (je suis pas sur du terme) les arguments : fonction(int argc,char *argv[]) (ca devrais rappeler quelque chose )

    dans les solutions "usines a gaz" t'as aussi la possibilité d'utiliser les va_args.
    Sinon il peut aussi passer des listes, comme c'est d'usage dans les langages fonctionnels . C'est plus joli.

  7. #7
    Membre à l'essai
    Inscrit en
    Juillet 2004
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 25
    Points : 11
    Points
    11
    Par défaut
    il existe des fonctions elliptiques (je crois que c'est le nom) où tu peux passer un nombre de paramètres variables et le dernier doit être NULL, en tout cas c'est conseillé pour détecter la fin de la liste des paramètres.
    le soucis de cette méthode est qu'il faut connaitre à l'avance le type des paramètres, la solution est de passer un paramètre par paire : son type et la donnée.

    par exemple ca donnerait un appel de cette manière

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    fonction ( INT_REF, myIntValue,
               FLOAT_REF, myFloatValue,
               NULL);
    je vais voir si je retrouve mon document a ce propos

  8. #8
    Membre éprouvé Avatar de gnto
    Homme Profil pro
    Ingénieur système logiciel
    Inscrit en
    Janvier 2006
    Messages
    923
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur système logiciel
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2006
    Messages : 923
    Points : 1 210
    Points
    1 210
    Par défaut
    Citation Envoyé par tomazy
    il existe des fonctions elliptiques (je crois que c'est le nom) où tu peux passer un nombre de paramètres variables et le dernier doit être NULL, en tout cas c'est conseillé pour détecter la fin de la liste des paramètres.
    le soucis de cette méthode est qu'il faut connaitre à l'avance le type des paramètres, la solution est de passer un paramètre par paire : son type et la donnée.

    par exemple ca donnerait un appel de cette manière

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    fonction ( INT_REF, myIntValue,
               FLOAT_REF, myFloatValue,
               NULL);
    je vais voir si je retrouve mon document a ce propos
    On ma appris que c'étais des fonctions variadiques bref les termes ca change d'une école à l'autre.

    Je pense que tu parle de va_arg,va_start,va_end cité ci-dessus

  9. #9
    Membre à l'essai
    Inscrit en
    Juillet 2004
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 25
    Points : 11
    Points
    11
    Par défaut
    oui, j'avais lu en diagonale

    j'ai trouvé ça rapidement si cette solution t'intéresse
    http://www.developpez.net/forums/showthread.php?t=42038
    http://www.developpez.net/forums/showthread.php?t=18775

    et dans la FAQ
    http://c.developpez.com/faq/c/?page=..._args_variable

    c'est vrai que c'est un peu usine à gaz, mais pour l'avoir utilisé c'est très puissant

Discussions similaires

  1. extraction d'un nombre inconnu d'arguments
    Par phicarre dans le forum Ruby
    Réponses: 8
    Dernier message: 21/03/2014, 23h45
  2. Appel de fonctions/arguments
    Par GO dans le forum C++
    Réponses: 14
    Dernier message: 25/09/2006, 22h46
  3. Nombre limité d'arguments sur fonction
    Par richard038 dans le forum Langage
    Réponses: 5
    Dernier message: 16/05/2006, 22h35
  4. Comment appeller une fonction dynamiquement, à partir d'un argument
    Par Invité dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 23/04/2006, 16h47
  5. Réponses: 4
    Dernier message: 31/10/2005, 17h48

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