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 :

[C] tableau de chaines de caractères


Sujet :

C

  1. #1
    Membre régulier Avatar de kitsune
    Inscrit en
    Décembre 2004
    Messages
    341
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Décembre 2004
    Messages : 341
    Points : 112
    Points
    112
    Par défaut [C] tableau de chaines de caractères
    Bonsoir,


    j'ai une fonction dans laquelle je passe en paramètre un tableau de chaines de caracteres de la façon suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    void function(char **tableau)
    et dans la fonction quand j'écris :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    tableau[0]="blabla";
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    strcpy(tableau[0],"blabla");
    ça ne marche pas

    Alors je pense que j'ai du faire une erreur au niveau du pointeur, je dois mal comprendre comment le gérer...
    Merci de votre aide !
    This is NOT my boyfriend's computer.

  2. #2
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut Re: [C] tableau de chaines de caractères
    Citation Envoyé par kitsune
    j'ai une fonction dans laquelle je passe en paramètre un tableau de chaines de caracteres de la façon suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    void function(char **tableau)
    Comment est défini le tableau ?
    Pas de Wi-Fi à la maison : CPL

  3. #3
    Membre régulier Avatar de kitsune
    Inscrit en
    Décembre 2004
    Messages
    341
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Décembre 2004
    Messages : 341
    Points : 112
    Points
    112
    Par défaut
    Heu ben en fait je l'ai définis dans un segment pour le rendre global à tous mes processus :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    char **tableau;
    n=shmget(IPC_PRIVATE,4*sizeof(char *),IPC_CREAT|IPC_EXCL|0666);
    if(n!=-1)
         quadran=(char **)shmat(n[4],NULL,0);
    Apres je l'initialise :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    for(i=0;i<4;i++)
    		tableau[i]=" ";
    Et toujours dans mon main quand je fais un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    tableau[0]="blabla";
    Ben ça marche... C'est en entrant dans la fonction que ça plante...
    This is NOT my boyfriend's computer.

  4. #4
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    quadran=(char **)shmat(n[4],NULL,0);
    Tu ne testes pas si l'attachement à réussi ou échoué ?

    Ben ça marche... C'est en entrant dans la fonction que ça plante...
    Montre un peu plus de code, stp .

  5. #5
    Membre régulier Avatar de kitsune
    Inscrit en
    Décembre 2004
    Messages
    341
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Décembre 2004
    Messages : 341
    Points : 112
    Points
    112
    Par défaut
    Ben heu je crois que j'ai tout dis...

    Je fais un récapitulatif alors.
    Dans mon main j'ai ça (enfin en ce qui concerne le tableau quoi) :

    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
     
    char **tableau;
    int n, i;
     
    n=shmget(IPC_PRIVATE,4*sizeof(char *),IPC_CREAT|IPC_EXCL|0666);
    if(n!=-1)
       tableau=(char **)shmat(n,NULL,0);
     
    for(i=0;i<4;i++)
    		tableau[i]=" ";
     
    tableau[1]="blabla";
    ...
     
    function(tableau);
    Et dans function où je passe mon tableau de chaines de caracteres j'ai ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    voif function(char **tableau)
    {
        tableau[0]="blabla";
       // ou j'ai aussi testé avec
       strcpy(tableau[0],"blabla");
     
    }
    En fait dans le main je n'ai pas de probleme pour affecter une chaine dans mon tableau, c'est en arrivant dans la fonction que ça bloque...
    Alors bon si c'est pas une erreur flagrante sur l'utilisation de mon double pointeur, ça doit relever d'autre chose dans mon programme.
    Mais comme ça bloquait à ce moment là, je me suis dit que ça devait etre ça !

    merci !
    This is NOT my boyfriend's computer.

  6. #6
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par kitsune
    Ben heu je crois que j'ai tout dis...

    Je fais un récapitulatif alors.
    Si le code que tu as montré est le vrai, je ne vois pas de problèmes.

    Je le simule comme ceci :
    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
     
    #include <stdio.h>
    #include <stdlib.h>
     
    void function(char **tableau)
    {
       tableau[0] = "blabla";
     
    }
     
    int main(void)
    {
       char **tableau;
       int i;
     
       tableau = malloc(4 * sizeof(char *));
     
       for (i = 0; i < 4; i++)
          tableau[i] = " ";
     
       tableau[1] = "blabla";
     
       function(tableau);
     
       for (i = 0; i < 4; i++)
          printf ("'%s'\n", tableau[i]);
     
       free (tableau);
       return 0;
    }
    Mais dans la réalité, je suppose que 'fonction()' est dans un autre processus. Si c'est le cas il y a un problème de conception (gestion de la mémoire).
    1. D'un coté, tu alloues un tableau de 4 pointeurs sur char dans le zone de données partagées. OK.
    2. Ensuite (je simplifie un peu) tu initialises ces 4 pointeurs avec des adresses de chaines littérales appartenant à un processus.
    3. Enfin, tu passes le bloc à un autre processus.
    Le tableau est partagé, pas de problèmes pour lui.

    Par contre les adresses (contenus des 4 pointeurs) ne sont pas valides dans l'autre processus. Le comportement est indéterminé.

    Conclusion (et ce n'est pas un scoop). On ne met jamais de structure de données non linéaire dans un bloc de donné partagé.

    La solution est de créer un bloc de données contigües comme
    et de copier les données avec strcpy().
    Pas de Wi-Fi à la maison : CPL

  7. #7
    Membre régulier Avatar de kitsune
    Inscrit en
    Décembre 2004
    Messages
    341
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Décembre 2004
    Messages : 341
    Points : 112
    Points
    112
    Par défaut
    Heu d'accord je vois où est le problème...

    Et je ne peux pas partager les adresses aussi ?

    Parce que j'ai aussi voulu partager des tableaux identiques mais à 2 dimensions donc je suppose que je vais avoir le meme probleme...


    La solution est de créer un bloc de données contigües comme
    Code:
    char tab[4][32];
    Et je peux le segmenter aussi ?


    merci beaucoup pour votre aide
    This is NOT my boyfriend's computer.

  8. #8
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par kitsune
    Et je ne peux pas partager les adresses aussi ?
    Compliqué. Et si le processus est distant, ça ne fonctionnne pas.
    Parce que j'ai aussi voulu partager des tableaux identiques mais à 2 dimensions donc je suppose que je vais avoir le meme probleme...
    La solution est de créer un bloc de données contigües comme
    Code:
    char tab[4][32];
    Et je peux le segmenter aussi ?
    Ben oui. Du moment que c'est un bloc linéaire.

    Je te conseille de mettre toutes les données a partager dans une seule structure (pas de pointeurs, OK, que du linéaire) et de partager cette structure.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    struct shared
    {
       char tab[4][32];
       /* ... */
    };
    et ensuite, c'est très simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    struct shared *shared_data = NULL;
    int n, i;
     
    n=shmget(IPC_PRIVATE, sizeof *shared_data, IPC_CREAT | IPC_EXCL | 0666);
    if(n!=-1)
       tableau = shmat (n, NULL, 0);
     
    <...>
    Ne mettre un cast que si shmat() ne retourne pas un void*...
    Citation Envoyé par POSIX.1 (IEEE Std 1003.1)
    #include <sys/shm.h>

    void *shmat(int shmid, const void *shmaddr, int shmflg);
    Pas de Wi-Fi à la maison : CPL

  9. #9
    Membre régulier Avatar de kitsune
    Inscrit en
    Décembre 2004
    Messages
    341
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Décembre 2004
    Messages : 341
    Points : 112
    Points
    112
    Par défaut
    D'accord merci j'ai compris mais si je veux un tableau de chaines de caracteres je dois donc connaitre le nombre de caracteres de mes chaines a l'avance si je n'ai pas le droit de mettre de pointeurs ?

    C'est donc la seule solutions pour segmenter ce genre de chose ? (je connais pas trop en fait je commence dans le partage de données)


    merci beaucoup en tout cas
    This is NOT my boyfriend's computer.

  10. #10
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par kitsune
    D'accord merci j'ai compris mais si je veux un tableau de chaines de caracteres je dois donc connaitre le nombre de caracteres de mes chaines a l'avance si je n'ai pas le droit de mettre de pointeurs ?
    Oui. Il faut dimensionner en conséquence.

    Autre solution, utiliser les threads plutôt que les processus. Dans ce cas, les données statiques et dynamiques sont partagées d'office, et on peut utiliser les pointeurs. Par contre, attention à la synchronisation...

    http://emmanuel-delahaye.developpez.com/pthreads.htm
    Pas de Wi-Fi à la maison : CPL

  11. #11
    Membre régulier Avatar de kitsune
    Inscrit en
    Décembre 2004
    Messages
    341
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Décembre 2004
    Messages : 341
    Points : 112
    Points
    112
    Par défaut
    Ce qui est bizarre, c'est que j'ai partagée d'autres données comme des tableaux de pointeurs et ça marche...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    maillon **debut;
     
    m=shmget(IPC_PRIVATE,sizeof(maillon),IPC_CREAT|IPC_EXCL|0666);
    if(m!=-1)
         debut=(maillon **)shmat(m,NULL,0);
    maillon est une structure.

    Et j'ai le droit d'écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    char tableau[4][30];
     
    n=shmget(IPC_PRIVATE,4*30*sizeof(char),IPC_CREAT|IPC_EXCL|0666);
    if(n!=-1)
         tableau=shmat(n,NULL,0);
    ???

    et du coup mon tableau c'est un pointeur sur pointeur non ? Si je veux le passer en parametre de fonction je dois faire un char **tab ?

    merci
    This is NOT my boyfriend's computer.

  12. #12
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par kitsune
    Ce qui est bizarre, c'est que j'ai partagée d'autres données comme des tableaux de pointeurs et ça marche...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    maillon **debut;
     
    m=shmget(IPC_PRIVATE,sizeof(maillon),IPC_CREAT|IPC_EXCL|0666);
    if(m!=-1)
         debut=(maillon **)shmat(m,NULL,0);
    maillon est une structure.
    Ca marche par hasard. Le bon type est :
    Et j'ai le droit d'écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    char tableau[4][30];
     
    n=shmget(IPC_PRIVATE,4*30*sizeof(char),IPC_CREAT|IPC_EXCL|0666);
    if(n!=-1)
         tableau=shmat(n,NULL,0);
    Moui, mais sizeof tableau aurait suffit... Pas la peine de compliquer la maintenance.
    et du coup mon tableau c'est un pointeur sur pointeur non ?
    Pas du tout, non. Un tableau, c'est un tableau.
    Si je veux le passer en parametre de fonction je dois faire un char **tab ?
    Non. Tu passes l'adresse du premier élément qui est de type (dans le contexte 'paramètre de fonction') :
    qui peut s'écrire
    http://emmanuel-delahaye.developpez.....htm#param_tab
    Pas de Wi-Fi à la maison : CPL

  13. #13
    Membre régulier Avatar de kitsune
    Inscrit en
    Décembre 2004
    Messages
    341
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Décembre 2004
    Messages : 341
    Points : 112
    Points
    112
    Par défaut
    D'accord j'ai fais une grosse erreur quant à l'utilisation de tableaux à n dimensions... Je pensais que comme le nom d'un tableau simple est en fait un pointeur qui pointe sur l'adresse du 1er element du tableau, que pour les tableaux à n dimensions c'était pareil sauf que la déclaration et le passage en paramètre change....

    J'ai tout modifié dans mes déclarations et fonctions et ça passe à la compil sauf que j'ai encore un problème avec mes segments :

    il me dit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    main.c:65: erreur: incompatible types in assignment
    pour ce type d'instruction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    quadran=shmat(n,NULL,0);
    ???

    (pour ce qui est de ma structure maillon, en fait mon maillon **debut est un tableau de pointeurs sur maillon c'est pour ça que j'ai 2 *)

    merci beaucoup pour vos explications et votre aide, je commence à y voir plus clair
    This is NOT my boyfriend's computer.

  14. #14
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par kitsune
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    main.c:65: erreur: incompatible types in assignment
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    quadran=shmat(n,NULL,0);
    Je suppose que 'quadran' est un pointeur.

    Comme je te l'ai déjà dit, si le type retourné par ton shmat() n'est pas (void*), il faut un cast du type désiré. Vérifie quand même si tu ne peux pas avoir un système plus à jour...

    Quelques précisions.

    Dans le monde Unixoïde, les fonctions comme shmat() font partie des fonctions 'systèmes' (man 2). Elles sont fournies par le système et n'ont aucun rapport avec le langage C, si ce n'est qu'il existe une interface écrite en C (<unistd.h>).

    Si cet interface a été définie avant la normalisation du C, (le mot-clé void n'existait pas encore), la fonction retourne char*, d'où l'obligation du cast.

    Depuis 1989 (ANSI) ou 1990 (ISO), le mot clé void est défini. Dans le même temps, la norme ISO POSIX.1 a été développée, et elle s'appuie, pour définir les interfaces, sur la norme C 90. C'est pourquoi pour POSIX.1, shmat() retourne void*, ce qui rend le cast inutile.

    http://emmanuel-delahaye.developpez.com/notes.htm#posix
    Pas de Wi-Fi à la maison : CPL

  15. #15
    Membre régulier Avatar de kitsune
    Inscrit en
    Décembre 2004
    Messages
    341
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Décembre 2004
    Messages : 341
    Points : 112
    Points
    112
    Par défaut
    Ben du coup j'ai défini ma variable quadran comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    char quadran[4][30];
    pour reprendre ce qui a été dit plus haut et même quand je mets un cast ça me met la même erreur... j'ai essayé avec (char *).

    Alala pas évident la segmentation...
    This is NOT my boyfriend's computer.

  16. #16
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par kitsune
    Ben du coup j'ai défini ma variable quadran comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    char quadran[4][30];
    Alala pas évident la segmentation...
    Rien à voir. C'est exactement comme pour allouer de la mémoire dynamique. Un tableau ne peut pas être modifier, on a pas le droit d'écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
      T a[N];
     
      a = ...;
    Je t'avais conseillé de tout mettre dans une structure parce que c'est beaucoup plus simple à gérer...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    struct shared
    {
       char quadran[4][30];
    };
     
    struct shared *p_shared = ...
    la taille à allouer est sizeof *p_shared...

    Si tu tiens au tableau, il faut un pointeur sur tableau ce qui entraine une syntaxe assez tordue... Je te laisse faire...
    Pas de Wi-Fi à la maison : CPL

  17. #17
    Membre régulier Avatar de kitsune
    Inscrit en
    Décembre 2004
    Messages
    341
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Décembre 2004
    Messages : 341
    Points : 112
    Points
    112
    Par défaut
    Ben c'était parce que j'ai 3 tableaux à partager...
    je peux mettre les 3 dans la structure ?

    (merci de votre patience.......)
    This is NOT my boyfriend's computer.

  18. #18
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par kitsune
    Ben c'était parce que j'ai 3 tableaux à partager...
    je peux mettre les 3 dans la structure ?
    Ben oui, je te l'ai déjà dit.
    Pas de Wi-Fi à la maison : CPL

  19. #19
    Membre régulier Avatar de kitsune
    Inscrit en
    Décembre 2004
    Messages
    341
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Décembre 2004
    Messages : 341
    Points : 112
    Points
    112
    Par défaut


    ok c'est bon... Du coup j'ai toujours le même problème donc ça devait pas venir de ça finalement mais au moins j'ai un code propre et j'ai mieux compris cette histoire de segments et de tableaux à plusieurs dimensions !

    Merci de votre aide c'est gentil d'avoir pris le temps
    This is NOT my boyfriend's computer.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 10
    Dernier message: 31/05/2007, 15h10
  2. Liste de tableau de chaine de caractère
    Par johnnydepp dans le forum C
    Réponses: 2
    Dernier message: 25/02/2007, 12h26
  3. tableau de chaine de caractères
    Par psgman113 dans le forum C
    Réponses: 15
    Dernier message: 22/01/2007, 18h52
  4. Pointeur, tableau et chaines de caractères.
    Par rouliane dans le forum C++
    Réponses: 8
    Dernier message: 19/12/2006, 20h27
  5. Réponses: 15
    Dernier message: 04/11/2006, 10h02

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