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 :

fonctions parametres


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Inscrit en
    Février 2004
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 117
    Points : 35
    Points
    35
    Par défaut fonctions parametres
    salut a ts

    voila je voudrais juste savoir comment on peut gerer une fonction qui a un nombre de parametres indefinis avec un protype dans ce genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    void fonction (type arg,...)
    merci
    @+

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    1- Si tu disposes d'une chaîne de caractère décrivant les paramètres variables, style printf & cie, il faut utiliser les macros de <cstdarg>

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    void MyPrintf(const char* Format, ...)
    {
        // Formatage du message dans une chaîne de caractère
        char Buffer[512];
        va_list Params;
        va_start(Params, Format);
        vsprintf(Buffer, Format, Params);
        va_end(Params);
     
        // Ecriture
        cout << Buffer << endl;
    }
    2- Si tous tes paramètres ont le même type, mais que seul leur nombre varie, tu peux marquer leur fin par une valeur spéciale (NULL, -1, "", ...). Tu déclares un pointeur du type de tes paramètres, que tu balades jusqu'à la fin en l'incrémentant de 1 à chaque fois pour récupérer successivement les paramètres.

    Mais en général en C++ on peut avantageusement éviter cela, cf. cout et le chainages d'appels à <<.

  3. #3
    Nouveau membre du Club
    Inscrit en
    Février 2004
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 117
    Points : 35
    Points
    35
    Par défaut
    ben en fait je peu pas du tout faire une fonctions style cout sa servirai pas a grand chose
    j'ai fais une classe pour la gestion des nombres complexes et j'ai voulais faire une fonctions translations ds laquelle on pourrait passer autant de parametre que l'on souhaite car avec un parametre sa sert pas a grand chose .

    donc si j'ai compris il faut que je fasse un pointeur sur le premier argument et ensuite je l'incremente de la taille des type passer en parametre

  4. #4
    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
    Ca ne marchera pas très bien : Dans les fonctions à arguments variables, on est limité à des types de base. Ou alors passer des pointeurs, ce qui alourdi l'écriture. Quel est le problème par rapport au chaînage proposé par Loulou24 (Au fait, Loulou, tu tiens au numéro quand on te cite ?) ?
    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
     
    class Vector
    {
      Vector &translate(Vector const &v);
      Vector &translate(double x, double y);
      Vector &rotate(double a);
      // ...
    };
     
    Vector &Vector::translate(Vector const &v)
    {
      // translate
      return *this;
    }
     
    Vector &Vector::translate(double x, double y)
    {
      // translate
      return *this;
    }
     
    Vector &Vector::rotate(double a);
    {
      // rotate
      return *this;
    }
     
    Vector v;
    v.translate(10, 5).rotate(45).translate(3,-1);
    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.

  5. #5
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Citation Envoyé par JolyLoic
    Au fait, Loulou, tu tiens au numéro quand on te cite ?
    Pas vraiment non, je préfère sans

  6. #6
    Nouveau membre du Club
    Inscrit en
    Février 2004
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 117
    Points : 35
    Points
    35
    Par défaut
    j'ai essayer ton truc loulou mais sa marche pas ou alors j'ai fais une connerie je sais pas

    voila la fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    void Translation (Complexe &vecteur,Complexe &point,...)
    {
     
        va_list Params; 
        va_start(Params, point); 
        point+=vecteur; 
        va_end(Params); 
     
    }
    sa modifie point mais pas les autres argument passer

  7. #7
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    C'est normal que cela ne modifie que point, puisque tu n'appelles += que sur point... Il faudrait te balader sur tous les paramètres et apliquer la translation sur chaque.

    Mais...

    Citation Envoyé par JolyLoic
    Ca ne marchera pas très bien : Dans les fonctions à arguments variables, on est limité à des types de base. Ou alors passer des pointeurs, ce qui alourdi l'écriture
    Donc tu ne pourras pas faire ce que tu souhaites de cette manière. Les solutions à base de chaînage d'appels te rebutent vraiment ?

  8. #8
    Nouveau membre du Club
    Inscrit en
    Février 2004
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 117
    Points : 35
    Points
    35
    Par défaut
    ouai mais ma fonction est declarer en friend
    et puis il faudrait appeler plusieurs fois la fonction

  9. #9
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    De toute façon tu n'y arriveras pas comme ça, tu n'as pas le choix. Après tu peux faire en sorte que le chaînage d'appel soit le plus sympa possible.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MonVecteur.Translate(P1)(P2)(P3)(P4);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MonVecteur.Translate(P1).Translate(P2).Translate(P3);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for (size_t i = 0; i < VecteurDePoints.size(); ++i)
        VecteurDePoints[i].Translate(MonVecteur);
    Ok le dernier n'est pas un chaînage, mais si tu peux te ramener à cette situation alors celui-ci ne sera pas nécessaire. Et puis il me semble plus correct de translater un point avec en paramètre le vecteur translation, plutôt que l'inverse (conceptuellement parlant).

  10. #10
    Nouveau membre du Club
    Inscrit en
    Février 2004
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 117
    Points : 35
    Points
    35
    Par défaut
    en fait j'ai reussi a faire ce que t'avait proposé de faire au debut avec le pointeur
    en fait sa marchait pas parce qu'il fallait decrementer le pointeur

    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
     
    void Translation (Complexe &vecteur,int nombre,Complexe &point,...)
    {
     
       Complexe *p = &point;
       int i=0;
     
       do 
       {
     
          (*p)+=vecteur;
          p--;
          i++;	
     
       }
       while (i!=nombre);
     
    }

  11. #11
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Tiens je ne savais pas que les paramètres étaient empilés dans cet ordre là

    Par contre ça me paraît très très douteux comme manip... Qu'est-ce qui te dit que tes paramètres optionnels seront passés par référence (d'ailleurs je ne pense pas qu'ils le soient) ? Et dans ce cas la décrémentation de ton pointeur ne te fait pas pointer sur le paramètre suivant. Bref je n'ai jamais essayé ce genre de manip mais ça me paraît très limite.

  12. #12
    Nouveau membre du Club
    Inscrit en
    Février 2004
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 117
    Points : 35
    Points
    35
    Par défaut
    ben je sais pas . les parametres je les passes normalement

    j'ai reessayer, sa marche nickel
    le seul truc un peu chiant c'est qu'il faut lui dire le nb de parametres

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Complexe u(1,1),a(0,0),b(1,1),c(2,2),d(3,3),e(4,4);
    Translation (u,5,a,b,c,d,e);

Discussions similaires

  1. Fonctions parametres variables imbriquees
    Par sone47 dans le forum C
    Réponses: 5
    Dernier message: 17/09/2010, 17h40
  2. [WD-2003] Fonction parametre Paragraph
    Par xoum89 dans le forum VBA Word
    Réponses: 3
    Dernier message: 04/06/2010, 11h49
  3. Rendre Une Fonction Parametrable
    Par khayate dans le forum VB.NET
    Réponses: 9
    Dernier message: 06/06/2007, 14h23
  4. [C# 2.0] Une fonction parametrée en remplacement de code.
    Par Pierre8r dans le forum Windows Forms
    Réponses: 1
    Dernier message: 31/05/2006, 14h06
  5. [VBA-W] [AUTOMATION]Liste Fonctions/Paramètres
    Par Sunny dans le forum VBA Word
    Réponses: 2
    Dernier message: 05/12/2002, 16h35

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