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++Builder Discussion :

[BORLAND c++] rediriger printf


Sujet :

C++Builder

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    D�cembre 2006
    Messages
    32
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : D�cembre 2006
    Messages : 32
    Par d�faut [BORLAND c++] rediriger printf
    salut,

    Voila j'ai une question bien que a mon avis cela soit impossible.
    Y'a t-il une solution (feinte), pour faire en sorte de rediriger printf vers un composant TMemo de borland.

    Autre question : ya t-il moyen sous borland ou autre EDI windows, d'utiliser _popen() sans avoir la fenetre msdos qui apparait .?

    merci.

  2. #2
    Membre confirm�
    Profil pro
    �tudiant
    Inscrit en
    Avril 2007
    Messages
    70
    D�tails du profil
    Informations personnelles :
    �ge : 37
    Localisation : France

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 70
    Par d�faut
    Salut,

    J'ai pas trop saisi ton probl�me,

    Par ex, tu as des printf dans le m�me code que ton Memo1, et tu voudrais que les printf de ton programme affiche leur r�sultat dans des Memo1 ??.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    D�cembre 2006
    Messages
    32
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : D�cembre 2006
    Messages : 32
    Par d�faut
    oui tout a fait, car mon appli graphique utilise un classe que j'ai faite pour du programme en console.
    Sa marche, mais sa n'affiche pas les printf.

  4. #4
    Membre �m�rite
    Avatar de maxim_um
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    895
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 895
    Par d�faut
    Il n'y a aucun probl�me, tu peux tout faire en c++, cependant ce n'est pas ton printf (�a c'est du C) que tu dois rediriger, mais la ou les variables que tu utilises dans ta fonction printf.

  5. #5
    Membre confirm�
    Profil pro
    �tudiant
    Inscrit en
    Avril 2007
    Messages
    70
    D�tails du profil
    Informations personnelles :
    �ge : 37
    Localisation : France

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 70
    Par d�faut
    Ouais sinon utilise l'outil de recherche de Borland, tu remplces printf par Memo1->Lines->Add.

    Mais bon apr�s t'aura toujours 2 3 trucs � retoucher, dsl mais j'ai pas d'autres id�es, ptre que une autre personne aura une m�thode un peu plus clair


    A+

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    D�cembre 2006
    Messages
    32
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : D�cembre 2006
    Messages : 32
    Par d�faut
    bha oui, je connais bien memo->lines-add ..

    mais voila, je vais quand meme pas passer en parametre de mon constructeur de ma classe (console) l'adresse de l'objet Tmemo, et remplacer mes printf par des memo->lines->add ?

    c laid.

  7. #7
    Membre �m�rite
    Avatar de maxim_um
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    895
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 895
    Par d�faut
    Ton probl�me est pourtant simple, tout ce que tu as � faire, c'est de rajouter une m�thode � ta classe qui te renvoi une cha�ne string. cela te permet de faire �voluer ta classe tout en lui permettant de rester compatible avec tes anciennes applications. Est-ce qu'il te faut un exemple ?

  8. #8
    Membre �clair�
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    57
    D�tails du profil
    Informations personnelles :
    �ge : 83
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 57
    Par d�faut
    Bonjour maxim_um.
    En ce qui me concerne je serai tr�s interess� par un exemple.
    Merci

  9. #9
    Membre �m�rite
    Avatar de maxim_um
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    895
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 895
    Par d�faut
    Salut Pierre Levy,
    je vais essayer de te proposer un exemple, je r�fl�chis � la question, notamment � la mani�re dont je peux pr�senter la chose, � dans quelques minutes

  10. #10
    Membre �m�rite
    Avatar de maxim_um
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    895
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 895
    Par d�faut
    Bon, apr�s relecture du topique, il est essentiellement questions,

    1: de class (donc de C++/iso)
    2: de printf (donc de C, mais comme en 1 il y a class et que C est impl�ment� dans C++, alors de C++/iso)
    3: de Memo (donc de C++/VCL)

    Ceci conduit au constat suivant, ma classe devra �tre programm� en C++/iso et ne doit pas faire intervenir la VCL.
    Pour m'assurer de la portabilit� du code, et r�sister � la tentation de la VCL, j'aime bien travailler avec deux compilateurs diff�rents. Ainsi, j'utiliserais d'abord MingW Developer Studio pour d�finir ma classe, ensuite C++ Builder pour le TMemo, et enfin revenir � Ming Developer studio pour m'assurer que mon code initial est toujours valide, autrement dit que ma classe est rest�e ind�pendante de la VCL et est donc toujours portable.

    Voil�, j'ai trac� les grandes lignes, je pr�pare le code.

    Grrrrrrrrrrrrr, quand c'est pas le t�l�phone qui sonne c'est l'interphone, Grrrrrrrrrrrrr

  11. #11
    Membre �m�rite
    Avatar de maxim_um
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    895
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 895
    Par d�faut
    Bon voil� l'�tape 1:

    Avec MingW Developer Studio, vous pouvez rester sur C++ Builder mais il faut d�sactiver la VCL dans votre projet console

    L'en-t�te de la classe exemple classexp.h
    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
     
     
    //classexp.h
     
    //Suite à la demande de Pierre Levy, voici une des solutions possibles répondant à la requête
    //[BORLAND c++] rediriger printf sur http://www.developpez.net/forums/showthread.php?p=2196243
    //Pour l'exemple, j'utilise ici le strict minimum, ceci à titre d'illustration.
    //Cependant si vous en ressentez le besoin, il est possible de l'agrémenter ou de le compléter. 
     
     
    //inclusion pour l'utilisation de printf
    #include <stdio.h>
     
     
    //je déclare une classe quelconque que j'appelle ClasseExemple
    class CExemple	
    {
    private:
    	//je déclare une variable nbr pour l'exemple
    	int nbr;
    public:
    	//Constucteur de la class, il initialisera la variable nbr
    	CExemple();
    	//je déclare une méthode de Classe public FonctionInitiale, 
    	//son implémentation est définie dans corp.cpp
    	int FInitiale(void);
    };
     
    //fin de classexp.h
    L'impl�mentation de la classe exemple classexp.cpp
    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
     
     
    //classexp.cpp
     
    //inclusion de la déclaration de la méthode de classe
    #include "classexp.h"
     
    //initialisation de la variable nbr
    CExemple::CExemple()
    {
      nbr=1;
    }
     
    //implémentation de la méthode FInitiale
    int CExemple::FInitiale()
    {
      char *chaine = "Le langage C++ = Le langage C";
      printf("Bonjour\n");
      printf("Il faut savoir que %s + %d\n",chaine,nbr);
      return 0;
    }
     
    //fin de l'implémentation classexp.cpp

    Voil� enfin le corp de l'application console main.cpp
    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
     
     
    //main.cpp
     
    #include <stdio.h>
    //inclusion de la déclaration et de l'implémentation 
    //de la classe CExemple utilisé plus bas
    #include "classexp.h"
     
     
     
    int main() 
    {
    //déclaration d'un objet classeAppel de type ClassExemple, cet objet
    //"hérite" des attributs et des méthodes de la classe CExemple
    CExemple cAppel;
    //appel de la fonction FInitiale "héritée"
    cAppel.FInitiale();
    return 0;
    }
     
    // fin de main.cpp
    Voil�, je vous laisse compiler le code et lancer l'ex�cutable produit.

  12. #12
    Membre �m�rite
    Avatar de maxim_um
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    895
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 895
    Par d�faut
    NB:La mise en forme sera faite au fur et � mesure, elle me prend du temps...

    Attaquons-nous maintenant � l'�tape avec le Memo et � la modification de notre classe:

    Remarque: On peut faire la modification parce qu'on est responsable de l'entretien de notre classe.
    S'il en �tait autrement, il aurait �t� plus judicieux d'utiliser l'h�ritage au lieu de la modification directe.

    Lancement de C++ Builder

    On lance C++ Builder puis Fichier-> nouveau -> application fiche vcl.
    Ensuite Fichier -> enregistrer le projet sous -> pr�c�dentdossier*

    *utiliser le m�me dossier que le pr�c�dent projet sous Ming Developer studio, c'est � dire l� o� se trouve classexp.h et classexp.cpp

    Une fois le projet enregistr�, on ajoute un TMemo Memo1 et un TButton Button1 sur notre Form1.
    Enfin, on termine par un double clique sur le bouton Button1, pour g�n�rer le code correspondant � l'�v�nement OnClick de Button1, c'est � dire la m�thode void __fastcall TForm1::Button1Click(TObject *Sender).

    Le squelette de notre application VCL est fait, reste � int�grer notre classe dans le projet et � la modifier.


    Int�gration de notre classe dans le projet:

    Bon maintenant clique droit sur le projet dans la fen�tre de projet, on clique sur ajout�, et on s�lectionne classexp.cpp, on fait de m�me pour classexp.h pour y acc�der facilement.
    Maintenant notre classe est r�f�renc�e dans notre projet, mais pas encore incluse (l'inclusion se fera avec #include "classexp.h" dans l'unit1 du projet)...

    On ouvre classexp.cpp ou classexp.h par un double clique dessus sur la fen�tre de projet, et ainsi on peut proc�der aux modifications...

    Comme sp�cifi� plus haut, en #7, on va ajouter une m�thode � notre classe qui renvoie une cha�ne de type string. Cela permet de faire �voluer notre classe tout en lui permettant de rester compatible avec les autres applications qui l'utilisent.


    D�finissant nos besoins :
    nous utiliserons le type string et les flux du C++, nous devront inclure <string> <sstream> et <iostream>, bien qu'ils ne soient pas tous indispensables.

    PS: Je sais qu'il est aussi possible de faire quelque chose d'int�ressant avec la fonction stdout, elle permet de rediriger la sortie standard, comme j'ai pris une autre voie, je ne l'utiliserais pas, mais rien ne vous emp�che d'approfondir ce point.


    Modification de notre classe depuis le projet

    voici de mani�re brute les modifications qui seront apport�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
    23
    24
    25
    26
     
     
    //modification 1/2 pour classxp.h
    //inclusion
    #include <string>
    #include <iostream>
    #include <sstream>
    //fin de la modification  1/2
     
    //modification 2/2  pour classxp.h
    //déclaration de ma nouvelle méthode de classe FSecondaire
    std::string FSecondaire(void);
    //fin de la modification  2/2
     
    //modification 1/1 pour classxp.cpp
    //implémentation de la méthode de classe FSecondaire
    std::string CExemple::FSecondaire()
    {
    	//je commenterai ce code plus tard si le besoin s'en fait ressentir
    	char *chaine = "Le langage C++ = Le langage C";
    	std::ostringstream vretour;
    	vretour << "Bonjour\r\n"
    			<< "Il faut savoir que " <<  std::string(chaine) << " + " << nbr << "\r\n";
    	return vretour.str();
    }
    //fin de la modification  1/1


    Voici maintenant notre classe modifi�e

    L'en-t�te de la classe exemple classexp.h
    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
     
     
    //classexp.h
     
    //Suite à la demande de Pierre Levy, voici une des solutions possibles répondant à la requête
    //[BORLAND c++] rediriger printf sur http://www.developpez.net/forums/showthread.php?p=2196243
    //Pour l'exemple, j'utilise ici le strict minimum, ceci à titre d'illustration.
    //Cependant si vous en ressentez le besoin, il est possible de l'agrémenter ou de le compléter. 
     
    //modification 1/2
    //inclusion
    #include <string>
    #include <iostream>
    #include <sstream>
    //fin de la modification  1/2
     
    //inclusion pour l'utilisation de printf
    #include <stdio.h>
     
     
     
    //je déclare une classe quelconque que j'appelle ClasseExemple
    class CExemple	
    {
    private:
    	//je déclare une variable nbr pour l'exemple
    	int nbr;
    public:
    	//Constucteur de la class, il initialisera la variable nbr
    	CExemple();
    	//je déclare une méthode de Classe public FonctionInitiale, 
    	//son implémentation est définie dans corp.cpp
    	int FInitiale(void);
     
    //modification 2/2
    //déclaration de ma nouvelle méthode de classe FSecondaire
    std::string FSecondaire(void);
    //fin de la modification  2/2
     
     
    };
     
    //fin de classexp.h

    L'impl�mentation de notre classe classexp.cpp

    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
     
     
    //inclusion de la déclaration de la méthode de classe
    #include "classexp.h"
     
    //initialisation de la variable nbr
    CExemple::CExemple()
    {
      nbr=1;
    }
     
    //implémentation de la méthode FInitiale
    int CExemple::FInitiale()
    {
      char *chaine = "Le langage C++ = Le langage C";
      printf("Bonjour\n");
      printf("Il faut savoir que %s + %d\n",chaine,nbr);
      return 0;
    }
     
    //modification 1/1
    //implémentation de la méthode de classe FSecondaire
    std::string CExemple::FSecondaire()
    {
    	//je commenterai ce code plus tard si le besoin s'en fait ressentir
    	char *chaine = "Le langage C++ = Le langage C";
    	std::ostringstream vretour;
    	vretour << "Bonjour\r\n"
    			<< "Il faut savoir que " <<  std::string(chaine) << " + " << nbr << "\r\n";
    	return vretour.str();
    }
    //fin de la modification  1/1
     
     
    //fin de l'implémentation classexp
    et enfin pour finire, voici ce � quoi ressemble
    l'unit1.cpp du projet C++ Builder,
    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
     
     
    //---------------------------------------------------------------------------
     
    #include <vcl.h>
    #pragma hdrstop
     
    #include "Unit1.h"
    #include "classexp.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
    	: TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    CExemple cAppel;
    AnsiString vtexmemo = cAppel.FSecondaire().c_str();
    Memo1->Lines->Add(vtexmemo);
    }
    //---------------------------------------------------------------------------

    On enregistre les changements, on recompile et on ex�cute notre application.

    Apr�s avoir v�rifi� que �a fonctionne conform�ment � nos attentes, on retourne sous Ming Developer studio.
    On ouvre � nouveau notre ancien projet, on le compile, et on remarque qu'il s'ex�cute correctement.

    On a redirig� printf (pensez aussi � la possible utilisation de stdout cit� plus haut) et
    Notre classe est rest�e compatible avec notre ancienne application. Donc mission accomplie, enfin presque, reste � optimiser le code en fonction des besoins.

    Voil�, j'esp�re que cet exemple apportera satisfaction aux lecteurs, et en particulier � Pierre Levy

  13. #13
    Membre �clair�
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    57
    D�tails du profil
    Informations personnelles :
    �ge : 83
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 57
    Par d�faut
    Merci beaucoup � maxim_um.

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    D�cembre 2006
    Messages
    32
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : D�cembre 2006
    Messages : 32
    Par d�faut
    oui, par contre sa ne resout pas mon probleme.
    je ne peux pas faire de methode qui renvoi des string ou char* ou autre.

    sans utiliser le principe du return, il me faut une autre solution.

  15. #15
    Membre averti
    Profil pro
    Inscrit en
    D�cembre 2006
    Messages
    32
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : D�cembre 2006
    Messages : 32
    Par d�faut
    bon j'ai reussi

    j'ai cr�e un fichier header qui selon le define :
    #define BORLANDGUI

    Affichera l'information avec printf ou avec Memo->Lines->Add()


    /*---------------------------------------------------------------------------------------------------
    Header by superpok (M. Pauquet) - 2007

    Rediriger l'affichage facilement [ STDOUT ou TMEMO ] !
    aide: Sous borland, veillez a bien laisser le #define BORLANDGUI
    Cr�er l'objet CDebug en passant en parametre le pointeur
    vers votre objet TMemo, puis faite :
    MDEBUG("mon message !");

    En mode console, commenter #define BORLANDGUI et faite simplement :
    MDEBUG("mon message !");
    ----------------------------------------------------------------------------------------------------*/
    #ifndef CDEBUG_H
    #define CDEBUG_H

    #include <stdio.h>

    #define BORLANDGUI

    #ifdef BORLANDGUI
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    // on estime qu'une ligne ne fera jamais plus de 256 caracteres
    static char CDebugBuffer[256]="";
    static TMemo* CDebugMemo;

    // verification ...
    // si la classe n'as pas �t� cr�ee
    // pointeur CDebugMemo pointe sur rien...
    static CDebugCreated = 0;

    #define MDEBUG(x...) \
    if(CDebugCreated) \
    { \
    snprintf(CDebugBuffer,256,x); \
    CDebugMemo->Lines->Add(CDebugBuffer); \
    }

    class CDebug
    {
    public:
    CDebug(TMemo* myptr)
    {
    CDebugMemo = myptr;
    CDebugCreated = 1;
    }
    };

    #else
    #define MDEBUG(x...) { printf(x); printf("\n"); }
    #endif

    #endif
    voila le resultat est sympatique, avec exactement le meme code dans les 2 application,
    on obtient le meme affichage : RESULTAT FLAGRANT

    par contre, sa marche aussi sans ';' a la fin de la commande, je sais pas trop pourquoi

  16. #16
    Membre averti
    Profil pro
    Inscrit en
    D�cembre 2006
    Messages
    32
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : D�cembre 2006
    Messages : 32
    Par d�faut
    par contre, il faut faire attention a qui cr�e l'objet CDebug
    c'est assez flou pour moi aussi ^^

  17. #17
    Membre Expert
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activit� : Responsable de compte
    Secteur : High Tech - Op�rateur de t�l�communications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Billets dans le blog
    1
    Par d�faut
    bonjour
    cela n'est malheureuement pas exact Superpok

    en effet
    Rediriger l'affichage facilement [ STDOUT ou TMEMO ] !
    aide: Sous borland, veillez a bien laisser le #define BORLANDGUI
    Cr�er l'objet CDebug en passant en parametre le pointeur
    vers votre objet TMemo, puis faite :
    MDEBUG("mon message !");
    c'est une macro , et rien n'assure qu'elle sera soit r� impl�ment�e ou modifi�e ou existante dans toutes les versions de c++ Builder

    La solution apport�e par <maxim_um> est par contre parfaitement portable et convient mieux a ce genre d'exercice

    cordialement
    vous trouverez mes tutoriels � l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les r�gles du forum

Discussions similaires

  1. rediriger printf flux de sortie
    Par kaiser92 dans le forum Visual C++
    R�ponses: 1
    Dernier message: 03/02/2010, 15h34
  2. Rediriger la sortie standard du printf
    Par yvesall dans le forum C
    R�ponses: 3
    Dernier message: 27/05/2008, 10h39
  3. [IDE][MFC] Rediriger les printf vers Output window
    Par chronos dans le forum Visual C++
    R�ponses: 3
    Dernier message: 24/12/2007, 17h24
  4. Outils, cours et NOUVEAUX tutoriels pour Borland C++Builder
    Par hiko-seijuro dans le forum C++Builder
    R�ponses: 10
    Dernier message: 12/03/2006, 22h33
  5. Tutoriels et liens pour le Borland Database Engine
    Par Community Management dans le forum Paradox
    R�ponses: 0
    Dernier message: 25/03/2002, 10h23

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