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 :

créer un tableau à partir d'une table de hachage


Sujet :

C

  1. #1
    Débutant Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Points : 117
    Points
    117
    Par défaut créer un tableau à partir d'une table de hachage
    bonjour à tous,
    j'ai un mot de type Chainon mot
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    typedef struct st_chainonMot ChainonMot;
     
    typedef struct st_liste
    {
    	ChainonMot *pPremier;
    } ListeMot;
     
    typedef ListeMot TableHachageMot[TAILLEHASH];
    ce mot contient une liste des coordonnées (numeros le lignes où il apparait)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    typedef struct st_chainonCoord ChainonCoord;
     
    typedef struct st_listeCoord
    {
    	ChainonCoord *pPremiere;
    } ListeCoord;
    Mon probleme c'est que j'aime créer un tableau de MotCompact à partir d'une table de hachage
    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
    int * CreerTableauLigne(ChainonMot const*pc,size_t taille)
    {
     
        ChainonCoord  const *pcCoord;
        int * tableauLigne=malloc(taille*sizeof(int));
        if(tableauLigne!=NULL)
        {
            size_t i=0;
     
                int annex=-1;
                for(pcCoord=coord_GetPremierC(GetPtrCoordC(pc));pcCoord!=NULL;pcCoord=ptr_GetNextC(pc))
                {
                    if(GetLigne(pc)!=annex)
                    {
                       tableauLigne[i]=GetLigne(pcCoord);
                        annex=GetLigne(pcCoord);
                        i++;
                    }
                }
     
        }
     
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    MotCompact* InitialiserMotCompact(ChainonMot* p,size_t  taille)
    {
        MotCompact* MC;
        MC->sczMot=GetMot(p);
        MC->pLignes=CreerTableauLigne(p,taille);
     
    }
    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
    MotCompact* CreerTableMotsCompacts(size_t n,TableHachageMot *DblTableHash1fr)
    {
        MotCompact  *pRet=malloc( TAILLEHASH * TAILLEHASH *sizeof(MotCompact));
        int i=0,j,k;
        if(pRet!=NULL)
        {
            for(j=0;j<TAILLEHASH;j++)
            {
                for(k=0;k<TAILLEHASH;k++)
                {
                    pRet[i]=InitialiserMotCompact(DblTableHash1fr[j][k],n);
                    i++;
                }
             }
        }
        return  pRet;
    }

    dans la ligne en gras ya 2erreurs:
    erreur: incompatible type for argument 1 of ‘InitialiserMotCompact’|
    erreur: incompatible types in assignment|
    des idées svp?
    merci

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 890
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 890
    Points : 219 432
    Points
    219 432
    Billets dans le blog
    123
    Par défaut
    Bonjour,

    Il y a une petite incohérence dans le code:

    Nous avons:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    TableHachageMot *DblTableHash1fr
    Qui est donc un pointeur sur TableHachageMot. On peut aussi pensé que c'est un tableau à une dimension (ça doit en être un ).

    Mais lors de l'appel à InitialiserMotCompact, nous essayons d'utiliser le DblTableHash1fr, comme si c'était un tableau à double dimension ( du coup le compilateur râle ).

    Comme InitialiserMotCompact accepte un pointeur sur un ChainonMot, il faudra plus ecrire quelque chose de ce genre ->
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    pRet[i]=InitialiserMotCompact(DblTableHash1fr[k].pPremier,n);
    Mais du coup, il y a un des deux for, qui pourrait s'avérer inutile.

  3. #3
    Débutant Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Points : 117
    Points
    117
    Par défaut
    Merci LittleWhite,
    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
    MotCompact* CreerTableMotsCompacts(size_t n,TableHachageMot *DblTableHash1fr)
    {
        MotCompact  *pRet=malloc( TAILLEHASH * TAILLEHASH *sizeof(MotCompact));
        int i=0,j,k;
        if(pRet!=NULL)
        {
            for(j=0;j<TAILLEHASH;j++)
            {
                for(k=0;k<TAILLEHASH;k++)
                {
                    pRet[i]=InitialiserMotCompact(DblTableHash1fr[j][k].pPremier,n);
                    i++;
                }
             }
        }
        return  pRet;
    }
    il m'affiche une seule erreur :
    erreur: incompatible types in assignment|

  4. #4
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 890
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 890
    Points : 219 432
    Points
    219 432
    Billets dans le blog
    123
    Par défaut
    L'erreur vient du fait, que InitialiserMotCompact retourne un MotCompact* alors que l'on essaie d'écrire dans un MotCompact.
    pRet[i] -> est un MotCompact
    pRet -> est un MotCompact* .

    Du coup, je propose en solution de déclaré pRet comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    MotCompact **pRet=malloc( TAILLEHASH * TAILLEHASH *sizeof(MotCompact*));
    Ce qui donne un tableau de pointeur de MotCompact.

    Par contre, il faut aussi modifier le type de retour de CreerTableMotsCompacts()
    Et je ne sais toujours pas si ce que je dis est une solution correcte

  5. #5
    Membre éclairé
    Avatar de Pouet_forever
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    671
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 671
    Points : 842
    Points
    842
    Par défaut
    Il faut que tu modifies ta fonction aussi, tu déclares un pointeur sur MC mais tu n'alloues pas de mémoire. Et juste après tu tentes d'accéder à MC->XXX :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    MotCompact* InitialiserMotCompact(ChainonMot* p,size_t  taille)
    {
        MotCompact* MC;
        MC->sczMot=GetMot(p);
        MC->pLignes=CreerTableauLigne(p,taille);
     
    }

  6. #6
    Débutant Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Points : 117
    Points
    117
    Par défaut
    Merci Pouet,
    voilà c'est fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    MotCompact* InitialiserMotCompact(ChainonMot* p,size_t  taille)
    {
        MotCompact* MC = malloc(sizeof(MotCompact));
        MC->sczMot=GetMot(p);
        MC->pLignes=CreerTableauLigne(p,taille);
    }

  7. #7
    Débutant Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Points : 117
    Points
    117
    Par défaut
    dans la fonction principale j'ai fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      MotCompact* MC = malloc(sizeof(MotCompact));
    MC=CreerTableMotsCompacts(DblTableHash1fr);
    mais il m'affiche une erreur du type :
    |attention : assignment makes pointer from integer without a cast
    je vois pas pourquoi ?
    aussi là
    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
    MotCompact** CreerTableMotsCompacts(TableHachageMot *DblTableHash1fr)
    {
        size_t n;
       MotCompact **pRet=malloc( TAILLEHASH * TAILLEHASH *sizeof(MotCompact*));
    
        int i=0,j,k;
        if(pRet!=NULL)
        {
            for(j=0;j<TAILLEHASH;j++)
            {
                for(k=0;k<TAILLEHASH;k++)
                {
                    n=nombreLigne(&DblTableHash1fr[j][k]);
                    pRet[i]=InitialiserMotCompact(&DblTableHash1fr[j][k],n);
                    i++;
                }
             }
        }
    
        return  pRet;
    }
    il ma'affiche 2erreurs :
    |erreur: conflicting types for ‘CreerTableMotsCompacts’|
    erreur: previous implicit declaration of ‘CreerTableMotsCompacts’ was here|

  8. #8
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 890
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 890
    Points : 219 432
    Points
    219 432
    Billets dans le blog
    123
    Par défaut
    Pour la première partie, c'est la modification que j'ai suggeré qui cause des problèmes.
    Il faut ecrire ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     MotCompact** MC = NULL;
    MC=CreerTableMotsCompacts(DblTableHash1fr);
    On a pas besoin de faire un malloc dans ce cas là, car il sera fait dans la fonction CreerTableMotsCompacts();

    Pour l'erreur suivante, c'est à cause que vous avez le prototype de la fonction ( début du fichier .c , ou fichier .h) qui est pas le même que celui ou la fonction est définie.
    Il faudra mettre ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    MotCompact** CreerTableMotsCompacts(TableHachageMot *DblTableHash1fr)
    aux deux endroits.

  9. #9
    Membre éclairé
    Avatar de Pouet_forever
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    671
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 671
    Points : 842
    Points
    842
    Par défaut
    Ta fonction retourne un pointeur de pointeur, donc il faut le récupérer en tant que pointeur de pointeur.
    Et il ne faut pas non plus allouer de la mémoire que tu as allouée dans ta fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MotCompact** MC = CreerTableMotsCompacts(DblTableHash1fr);

  10. #10
    Débutant Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Points : 117
    Points
    117
    Par défaut
    bonjour,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    MotCompact* RechercherMot(MotCompact const  pc[],char*  mot)
    {
        int i;
        for(i=0;i<TAILLEHASH;i++)
        {
            if(strcmp(GetMotCompact(&pc[i]), mot ) == 0)
            return (&pc[i]);
        }
        return NULL;
    }
    j(ai une erreur de compilaltion :attention : return discards qualifiers from pointer target type|
    des idées svp?
    merci

  11. #11
    Membre éclairé
    Avatar de Pouet_forever
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    671
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 671
    Points : 842
    Points
    842
    Par défaut
    Tu as 2 solutions :

    1*) Tu enlèves le mot 'const' de ta fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MotCompact* RechercherMot(MotCompact pc[],char*  mot)
    2*) Tu fais un cast :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return (MotCompact*)(&pc[i]);
    Je préfère de loin la première solution

  12. #12
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Aussi, on peut faire mieux en triant le tableau après sa création (avec qsort()), car ça permet ensuite de rechercher avec bsearch(), qui est plus rapide qu'une recherche linéaire.

  13. #13
    Débutant Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Points : 117
    Points
    117
    Par défaut
    ok , merci pour vos reponses;
    je trie le tableau et puis je fais la recherche

  14. #14
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    D'abord, il faudrait qu'on corrige la fonction CreerTableMotsCompact pour qu'elle crée vraiment un tableau de MotCompact et non pas un tableau de pointeurs.

  15. #15
    Débutant Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Points : 117
    Points
    117
    Par défaut
    Sauf que j'ai un souci avec cette fonction :
    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
    MotCompact** CreerTableMotsCompacts(TableHachageMot *DblTableHash1fr)
    {
     
       MotCompact **pRet=malloc( TAILLEHASH * TAILLEHASH *sizeof(MotCompact*));
     
        int i=0,j,k;
        if(pRet!=NULL)
        {
            for(j=0;j<TAILLEHASH;j++)
            {
                for(k=0;k<TAILLEHASH;k++)
                {
                  //  n=nombreLigne(&DblTableHash1fr[j][k]);
                    pRet[i]=InitialiserMotCompact(&DblTableHash1fr[j][k]);
                    i++;
                }
             }
        }
     
        return  pRet;
    }
    attention : passing argument 1 of ‘InitialiserMotCompact’ from incompatible pointer type|

  16. #16
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Justement, il faut qu'on les modifie toutes les deux.

  17. #17
    Débutant Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Points : 117
    Points
    117
    Par défaut
    j'ai essayé ca comme on a déja fait
    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
    MotCompact* CreerTableMotsCompacts(TableHachageMot *DblTableHash1fr)
    {
    
       MotCompact *pRet=malloc( TAILLEHASH * TAILLEHASH *sizeof*pRet);
    
        int i=0,j,k;
        if(pRet!=NULL)
        {
            for(j=0;j<TAILLEHASH;j++)
            {
                for(k=0;k<TAILLEHASH;k++)
                {
                    pRet[i]=InitialiserMotCompact(&DblTableHash1fr[j][k]);
                    i++;
                }
             }
        }
    
        return  pRet;
    }
    attention : passing argument 1 of ‘InitialiserMotCompact’ from incompatible pointer type|
    erreur: incompatible types in assignment|

  18. #18
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    On va faire un InitialiserMotCompact() comme ça:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void InitialiserMotCompact(MotCompact *pThis, ChainonMot const *pc)
    {
    	pThis->pLignes = CreerTableauLigne(pc, GetNbLigne(pc));
    	pThis->nbLignes = GetNbLigne(pc));
     
    	/*On pourrait faire mieux avec un allocateur, mais on n'en est pas là visiblement.*/
    	pThis->sczMot = strdup(GetMot(pc));
    }

  19. #19
    Débutant Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Points : 117
    Points
    117
    Par défaut
    oui, merci,
    mais là on doit modifier cette fonction non?
    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
    int * CreerTableauLigne(ChainonMot const*pc)
    {
        size_t taille = GetNbLignes(pc);
        ChainonCoord const *pcCoord;
        int * tableauLigne=malloc(taille*sizeof(int));
        if(tableauLigne!=NULL)
        {
            size_t i=0;
     
                int annex=-1;
                for(pcCoord=coord_GetPremierC(GetPtrCoordC(pc));pcCoord!=NULL;pcCoord= coord_GetNextC(pcCoord))
                {
                    if( GetLigne(pcCoord)!=annex)
                    {
                       tableauLigne[i]=GetLigne(pcCoord);
                        annex=GetLigne(pcCoord);
                        i++;
                    }
                }
                assert(i==taille);
     
        }
     
         return tableauLigne;
     
    }

  20. #20
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Celle-là, non.

    CreerTableMotsCompacts() doit être modifiée, par contre.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 5 12345 DernièreDernière

Discussions similaires

  1. [MySQL] Créer un tableau à partir d'une base de données
    Par barakobama95 dans le forum PHP & Base de données
    Réponses: 15
    Dernier message: 30/09/2013, 16h58
  2. Créer un array à partir d'une table
    Par FanFan44 dans le forum Débutez
    Réponses: 4
    Dernier message: 14/06/2013, 17h50
  3. [MySQL] Créer un tableau à partir d'une requete SQL
    Par extream dans le forum PHP & Base de données
    Réponses: 14
    Dernier message: 02/06/2013, 20h11
  4. Réponses: 1
    Dernier message: 17/04/2013, 20h00
  5. [MySQL] créer un tableau à partir d'une base de donnée
    Par bastien dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 21/01/2009, 15h03

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