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 :

params : comment connaitre le nombre d'argument réel lors de l'appel d'une fonction ?


Sujet :

C#

  1. #1
    Membre expérimenté Avatar de Lorenzo77
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    1 472
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 472
    Points : 1 537
    Points
    1 537
    Par défaut params : comment connaitre le nombre d'argument réel lors de l'appel d'une fonction ?
    salut,

    je ne sais pas comment connaitre le nombre d'argument réel qu'une fonction reçoit lors de son appel ?
    le problème vient de l'utilisation du mot clé params ...

    déclaration de la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public void testParams(params string[] list)
    {
       Console.WriteLine("params");
       for( int i = 0; i < list.Length; i++ ) {
          Console.WriteLine(list[i]);
       }
       Console.WriteLine();
    }

    1- 1er appel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    string[] _1arg = new string[] { "a", "b", "c" };
    testParams(_1arg);
    2- 2eme appel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    testParams("a", "b", "c");
    au 1er appel la fonction ne reçoit qu'un seul argument tandis qu'au 2eme appel elle en reçoit 3 ... et je ne ne sais pas comment faire la différence entre le 1er et le 2eme dans le corps de la fonction



    j'ai bien essayé de définir une autre fonction n'acceptant qu'un seul argument de type string[] mais le compilateur refuse :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public void testParams(string[] list)
    {
       Console.WriteLine("sans params");
       for( int i = 0; i < list.Length; i++ ) {
          Console.WriteLine(list[i]);
       }
       Console.WriteLine();
    }
    Le type '_persoTest.Form1' définit déjà un membre appelé 'testParams' avec les mêmes types de paramètres



    quelqu'un connait la soluce pour connaitre le nombre réel d'argument que reçoit une fonction ?

    merci
    Le plus grand arbre est né d'une graine menue, une tour de neuf étages est partie d'une poignée de terre.
    Mon blog : http://web.codeur.free.fr

  2. #2
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Le premier appel n'est pas très clair tout de même. Quand on crée une fonction qui accepte un nombre variable d'arguments c'est justement pour ne pas créer un array avant puis le passer à la fonction (et si c'est un params object[] list, le premier argument sera un object[]).

    Crée des fonctions avec un nom différent, ou tout simplement utilise toujours un string[] et pas un params string[] (c'est à mon sens plus clair).

  3. #3
    Membre expérimenté Avatar de Lorenzo77
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    1 472
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 472
    Points : 1 537
    Points
    1 537
    Par défaut
    tout le problème est la : cette méthode est utilisé par une classe Affichage (qui affiche tout ce qu'elle reçoit ) et je dois modifier l'affichage des valeurs qu'elle reçoit suivant la manière dont elle les reçoit :
    -je ne peux pas avoir plusieurs noms pour la même action (afficher les valeurs)
    -je dois modifier l'affichage des valeurs suivant qu'elle reçoit un tableau ou un nombre d'arguments X (pour marquer une différence)

    donc si elle recoit un tableau en argument, je dois indiquer qu'elle a recu un tableau et afficher toutes les valeurs du tableau.
    au contraire si elle recoit plusieurs valeurs, je dois juste les afficher a la suite sans faire de ligne vide.

    les méthodes publiques (info/avertissement/erreur/fatal) de la classe Affichage sont déclarés comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public void info(params object[] t)
    histoire de pouvoir l'appeler comme je l'ai fait dans le 1er message.
    je peux avoir besoin d'afficher un tableau ou juste une variable ou encore un ensemble de variables ... le but de tout ceci est de couvrir toutes les possibilités.


    la question tient toujours : comment connaitre le nombre réel d'argument que reçoit une méthode ?
    mais avec une petite modif : est qu'il est possible de connaitre le nombre d'arguments que reçoit une méthode ?


    merci
    Le plus grand arbre est né d'une graine menue, une tour de neuf étages est partie d'une poignée de terre.
    Mon blog : http://web.codeur.free.fr

  4. #4
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Soit je suis vraiment dans les vapes ...

    Quand tu fait params object[] t, t.Length c'est le nombre d'arguments passé à la fonction. Et si tu lui passe un array uniquement, ça renvoi 1 ...

  5. #5
    Membre expérimenté Avatar de Lorenzo77
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    1 472
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 472
    Points : 1 537
    Points
    1 537
    Par défaut
    et non
    c'est bien la tout mon probleme, si je fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    testParams("a", "b", "c");
    testParams(new string[] { "a", "b", "c" });
    avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public void testParams(params string[] list)
    {
       Console.WriteLine("params : "+list.Length);
    }
    dans les 2 cas list.Length vaut 3, impossible de faire la moindre distinction, pourtant le 1er appel reçoit 3 arguments alors que le 2eme appel n'en reçoit qu'un seul
    Le plus grand arbre est né d'une graine menue, une tour de neuf étages est partie d'une poignée de terre.
    Mon blog : http://web.codeur.free.fr

  6. #6
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Ahhhhhhh
    Bah alors je dirais que c'est impossible. En fait, avec ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    public Window1()
            {
                InitializeComponent();
     
                Test("a","b");
            }
     
            void Test(params string[] v)
            {
                System.Diagnostics.StackTrace mg = new System.Diagnostics.StackTrace();
                var f = mg.GetFrame(0);
                MessageBox.Show(f.GetMethod().ToString());
            }
    ça affiche
    Void Test(System.String[])
    Et de même, si on décompile le programme généré on voit que
    devient
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this.Test(new string[] { "a", "b" });
    Donc en gros quand le compilateur vois params il génère tout seul un System.Truc[] qui va contenir les arguments passés donc à l'exécution il n'y a strictement aucune différence entre tes deux appels, d'où tes problèmes avec le nombre d'arguments.

  7. #7
    Membre expérimenté Avatar de Lorenzo77
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    1 472
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 472
    Points : 1 537
    Points
    1 537
    Par défaut
    donc c'est pas possible, c'est con, ça remet en cause toute ma classe
    je vais quand meme continuer a chercher avec StackTrace/StackFrame et ParameterInfo, je connaissais pas ces classes, avec un peu de chance ...

    merci
    Le plus grand arbre est né d'une graine menue, une tour de neuf étages est partie d'une poignée de terre.
    Mon blog : http://web.codeur.free.fr

Discussions similaires

  1. Réponses: 31
    Dernier message: 30/09/2006, 22h08
  2. Réponses: 2
    Dernier message: 13/06/2006, 15h46
  3. comment connaitre le nombre de <tr> au sein d'un <table>
    Par pit9.76 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 09/06/2006, 13h27
  4. Réponses: 2
    Dernier message: 05/05/2006, 08h55
  5. comment connaitre le nombre ...
    Par mythtvtalk.com dans le forum Requêtes
    Réponses: 9
    Dernier message: 04/08/2003, 08h18

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