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 :

pointeurs sur fonction


Sujet :

C++

  1. #1
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut pointeurs sur fonction
    j'ai un bout de code qui est le suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    float rtnewt (void *(func)(float,float*,float*),float x1,float x2)
    puis l'appel de la fonction func:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    (*func)(x,&fl,&df);
    plus précisement, func est une "user-defined function" mathématique qui renvoie la valeur de cette fonction et sa dérivée en x.
    mes quelques connaissances en c++ me disent qu'il s'agit d'un pointeur sur fonction qui ne renvoie rien, et qui modifie fl et fd et qui passe par parametre x.
    maintenant, comment créer cette fonction func
    on peut prendre un exemple avec la fonction exponentielle.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    void *func(){
    double *fl;
    double *df; 
    fl=exp(x);
    df=(exp(x+0.01)-exp(x-0.01))/0.02;
     
     
    }
    mon pb est que je ne sais pas quoi mettre dans func().
    je ne comprends pas bien la structure de func

  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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    float rtnewt(void (*func)(float, float*, float*), float x1, float x2);
     
    void exponentielle(float x, float* fl, float* df)
    {
        *fl = exp(x);
        *df = (exp(x + 0.01) - exp(x - 0.01)) / 0.02; 
    }
     
    float x1 = ...:
    float x2 = ...;
    float resultat = rtnewt(&exponentielle, x1, x2);

  3. #3
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut
    merci j'ai quelques questions:
    *func :il s'agit bien d'un pointeur sur fonction?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    float rtnewt(void (*func)(float, float*, float*), float x1, float x2);
    qu'est ce que tu définis ici? Est-ce un prototype de la fonction rtnew?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    void exponentielle(float x, float* fl, float* df)
    {
        *fl = exp(x);
        *df = (exp(x + 0.01) - exp(x - 0.01)) / 0.02; 
    }
    pourquoi tu passes comme arguments fl et df alors qu'ils vont être modifies?
    fl est df sont des pointeurs sur des float.
    pourquoi on aurait pas pu faire:
    void exponentielle(float x)

    si on mettait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    void exponentielle(float x, float fl, float df)
    {
        fl = exp(x);
        df = (exp(x + 0.01) - exp(x - 0.01)) / 0.02; 
    }
    alors fl et df seraient modifies a l'intérieur de la fonction, mais pas a l'extérieur de la fonction.

  4. #4
    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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    *func :il s'agit bien d'un pointeur sur fonction?
    Oui (enfin, sans l'étoile).

    qu'est ce que tu définis ici? Est-ce un prototype de la fonction rtnew?
    Oui (le tien n'était pas correct, donc je l'ai corrigé).

    pourquoi tu passes comme arguments fl et df alors qu'ils vont être modifies?
    Comment veux-tu les modifier si tu ne les passes pas à la fonction ?

    pourquoi on aurait pas pu faire:
    void exponentielle(float x)
    Et comment tu récupères les résultats ?
    De toute façon rtnewt attend un void (*)(float, float*, float*), pas un void (*)(float).

    alors fl et df seraient modifies a l'intérieur de la fonction, mais pas a l'extérieur de la fonction
    Oui.

  5. #5
    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 : 50
    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
    Par défaut
    Citation Envoyé par Laurent Gomila Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    void exponentielle(float x, float* fl, float* df)
    {
        *fl = exp(x);
        *df = (exp(x + 0.01) - exp(x - 0.01)) / 0.02; 
    }
    Détail qui n'a rien à voir avec le C++, mais avec les math : Si on donne l'opportunité à l'utilisateur de rtnewt de définir lui même la valeur de la dérivée, c'est bien pour éviter d'utiliser des approximations dans les cas nombreux où l'on peut faire mieux. Donc, ici, j'écrirais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    void exponentielle(float x, float* fl, float* df)
    {
        *fl = exp(x);
        *df = *fl; 
    }
    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.

  6. #6
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut
    ok, mais a quoi sert df alors?
    je comprends pas ce que tu ecrits:

    df et fl auront les meme valeurs


    Et comment tu récupères les résultats ?
    les resultats sont accesibles dans l'espace memoire, grace a &

  7. #7
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut
    pour que ce soit plus compréhensible, je vous envoie le code source
    en entier
    il s'agit de la methode de newton pour la resolution d'equations.
    quand je compile, le compilateur me repond:

    & requires l-value

    qu'est ce qu'une l-value?

    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
     
     
    #include <stdio.h>
    #include <iostream>
    #include <math.h>
    #include <string>
    #define JMAX 20
    using namespace std;
     
     
     void exponentielle(float x, float* fl, float* df)
    {
        *fl = exp(x);
        *df = (exp(x + 0.01) - exp(x - 0.01)) / 0.02; 
    }
     
     
    float rtnewt (void (*func)(float,float *,float *),float x1,float x2,float xacc){
    	int j; 
    	float df,dx,f,rtn;
    	rtn=0.5*(x1+x2);
     
    	for(j=1;j<=JMAX;j++){
    		(*func)(rtn,&f,&df);
    		dx=f/df;
    		if((x1-rtn)*(rtn-x2)<0.0)
    			cout<<"e";
    	    if (fabs(dx)<xacc) return rtn;
    	}
    	return 0;
    }
     
    int main(){
    	float x1=-10;
        float x2=10;
    	float prec=0.001;
     
    	float x=1;
    	float* y=0;
    	float* z=0; 
    rtnewt(&exponentielle(x,y,z),x1,x2,prec);
     
    }

  8. #8
    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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    ok, mais a quoi sert df alors?
    je comprends pas ce que tu ecrits:

    df et fl auront les meme valeurs
    La dérivée d'exponentielle, c'est exponentielle. D'où l'optimisation consistant à placer dans df la même valeur que fl, pas besoin de calculer une dérivée classique.

    les resultats sont accesibles dans l'espace memoire, grace a &
    Ca veut rien dire...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rtnewt(&exponentielle(x,y,z),x1,x2,prec);
    Là il faut passer l'adresse de la fonction exponentielle, pas l'appeler avec des paramètres (c'est e qui provoque ton erreur de compilation). Regarde encore une fois mon code plus haut.

  9. #9
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    Une l-value est une valeur affectable: Une valeur pouvant être à gauche ("left" en anglais) d'un signe =.

    Ta ligne rtnewt(&exponentielle(x,y,z),x1,x2,prec); est incorrecte, car tu tentes de passer l'adresse d'une valeur retournée par l'appel exponentielle(x,y,z).
    Essaie ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rtnewt(&exponentielle, x1, x2, prec);
    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.

  10. #10
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut
    ce que je ne comprends tj pas c'est pourquoi utiliser la fonction avec un pointeur.
    pour moi, si on appelle la fonction sans paser par les pointeurs, et qu'on modifie les variables a l'intérieur d'une fonction dans la memoire, on pourra toujours acceder a ces variablea ailleurs que dans la fonction.

  11. #11
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    Ben non. En C et C++, le passage de paramètre se fait par valeur : La fonction ne manipule qu'une copie des variables, les modifications ne sont pas reportées.

    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
    void MauvaisEchange(int a, int b)
    {
    	int tmp = a;
    	a = b;
    	b = tmp;
    }
     
    void BonEchange(int *pa, int *pb)
    {
    	int tmp = *pa;
    	*pa = *pb;
    	*pb = tmp;
    }
     
    int main(void)
    {
    	int var1 = 1, var2 = 2, var3 = 3, var4 = 4;
    	MauvaisEchange(var1, var2);
    	BonEchange(&var3, &var4);
    	std::cout << var1 << var2 << var3 << var4 << std::endl;
    	return 0;
    }
    Et là, tu verras que seuls var3 et var4 ont été modifié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.

  12. #12
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    Toutefois, en C++, un nouveau type de passage de paramètres a été créé, le passage par référence :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    void BonEchangeParRef(int &a, int &b)
    {
    	int tmp = a;
    	a = b;
    	b = tmp;
    }
     
    int main(void)
    {
    	int var5 = 5, var6 = 6;
    	BonEchangeParRef(var5, var6);
    	std::cout << var5 << var6 << std::endl;
    	return 0;
    }
    Ce qui pour tes fonctions donnerait :
    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    #include <iostream>
    #include <cmath>
    #include <string>
    #define JMAX 20
    using namespace std;
     
     
    void exponentielle(float x, float & fl, float & df)
    {
    	fl = exp(x);
    	df = (exp(x + 0.01) - exp(x - 0.01)) / 0.02; 
    }
     
     
    float rtnewt (void (*func)(float,float &,float &), float x1, float x2, float xacc)
    {
    	int j; 
    	float df,dx,f,rtn;
    	rtn=0.5*(x1+x2);
     
    	for(j=1;j<=JMAX;j++)
    	{
    		(*func)(rtn,f,df);
    		dx=f/df;
    		if((x1-rtn)*(rtn-x2)<0.0)
    			cout<<"e";
    		if (fabs(dx)<xacc) return rtn;
    	}
    	return 0;
    }
     
    int main()
    {
    	float x1=-10;
    	float x2=10;
    	float prec=0.001;
     
    	rtnewt(&exponentielle, x1, x2, prec);
    	return 0;
    }
    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.

  13. #13
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut
    Ben non. En C et C++, le passage de paramètre se fait par valeur : La fonction ne manipule qu'une copie des variables, les modifications ne sont pas reportées.

    ca j'ai compris
    je pense que je me suis mal exprimé

    quand on pointe sur une fonction, on pointe sur quoi en realité?

  14. #14
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    PENSER AUX BALISES [quote] / [/quote]

    Dans le cas d'une fonction libre ou d'une fonction membre non-virtuelle, un pointeur de fonction pointe généralement sur le début de son code, je pense...
    Mais au niveau source, cela n'a pas vraiment d'importance...
    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.

  15. #15
    Expert confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    void (* func)(float,float&,float&);
    Déclare 'func' comme un "pointeur" de fonction prennant (float,float&,float&) comme arguments, et ne renvoyant rien...


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    float rtnewt (void *(func)(float,float&,float&),float x1,float x2)
    Déclare 'rtnewt' comme une fonction ayant besoin de trois paramètres:
    Une fonction (de type 'func' voir au dessus), et deux floats.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    void exponentielle (float x, float& fl, float& df)
    {
        df = fl = expf(x);
    }
     
    void logarithm (float x, float& fl, float& df)
    {
        fl = logf(x);
        df = 1.0f/x;
    }
    "exponentielle" et "logarithm" sont toutes deux des fonctions de type "func"... Et donc peuvent être passées en premier paramètre de "rtnewt".

    Comme quand tu écris:
    "toto" est de type "float"

    et bien...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    void logarithm (float x, float& fl, float& df)
    {
        fl = logf(x);
        df = 1.0f/x;
    }
    "logarithm" est de type "void (*)(float,float&,float&)"

  16. #16
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut
    ok merci
    mais quelle est la différence entre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    void (* func)(float,float&,float&);
     
    float rtnewt (void *(func)(float,float&,float&),float x1,float x2)
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    void ( func)(float,float&,float&);
     
    float rtnewt (void (func)(float,float&,float&),float x1,float x2)
    ce n'est pas moi qui est le code que j'ai envoyé
    mais c'est le deuxieme cas que j'aurais fait.

  17. #17
    Expert confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par défaut
    le '*'


  18. #18
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut
    merci

  19. #19
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    Attention, void * (func)(...) et void (*func)(...) ne sont pas du tout la même chose.
    • Je suis surpris que le premier compile si tu mets ce type directement en paramètre, car il y manque la notion de pointeur de fonction: Il y a plus une notion de fonction retournant un pointeur.
    • Le second, lui, est bien un pointeur de fonction ne retournant rien.
    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.

Discussions similaires

  1. Réponses: 10
    Dernier message: 03/02/2005, 13h09
  2. Réponses: 5
    Dernier message: 12/01/2005, 20h58
  3. pointeurs sur fonction en C++
    Par cemoi dans le forum C++
    Réponses: 7
    Dernier message: 29/11/2004, 13h19
  4. [langage] Pointeur sur fonction
    Par Fanch.g dans le forum Langage
    Réponses: 2
    Dernier message: 02/10/2004, 10h43
  5. Declaration de fonction retournant un pointeur sur fonction
    Par pseudokifaitladifférence dans le forum C
    Réponses: 5
    Dernier message: 11/08/2003, 19h37

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