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 :

malloc et segmentation fault


Sujet :

C

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 47
    Par défaut malloc et segmentation fault
    Bonjour à tous,

    je code (ou plutot debugge) en ce moment sur un petit programme de calcul sur des matrices:
    Je pars d'un tableau de flottants à deux dimensions (pouvant atteindre 10000 * 10000), le remplissage de ce tableau se passe tres bien.
    La deuxième étape consiste à convertir les valeurs de ce tableau en 0 si on celle-ci dépasse un seuil donné (0.9521 par exemple) en 1 sinon.
    Je ne dois en aucun cas modifier le tableau de flottant, car la conversion en 0 ou 1 intervient au sein d'un boucle avec incrementation du seuil à chaque tour.
    Je n'ai pas d'erreur à la compilation (gcc sous red hat) mais une segmentation fault qui arrive (la plupart du temps) au moment du malloc pour le tableau d'entier. Le plus bizarre, c'est que mon programme tourne pour des petites instances (dimension du tableau environ 10*10) mais seg fault pour les dimension plus importantes (c'est ennuyeux sachant que ça doit tourner sur du 10000 * 10000).

    ci joint les morceaux de codes qui me posent probleme:

    l'appel de mes fonctions:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    int main (int argc, char *argv[]){
            C = f2float(Size[0], Size[1]);
    	C = GetCoord(Mtab, Size);
    	Cos = CosCompute(C, Size);
    	C = deletePointer2float(C, Size[0], Size[1]);
    	printMCos(NVecteurs, Cos, Size);	
    	Madj = f2int(Size[0], Size[0]);
    	Madj = MadjCreate(Cos, Size, SEUIL);
    	Madj = deletePointer2int(Madj, Size[0], Size[0]);
    	return 0;
    }
    fonction d'allocation de memoire pour mes tableaux d'entier (celle pour le tableau de flottant est identique mis à part le cast en float)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int **f2int(int a, int b){
         int i;
     
         int **myPointer = (int **)malloc (a * sizeof(int*));
         for (i=0; i<a; i++)
             myPointer[i] = (int *)malloc (b * sizeof(int));
         return myPointer;
    }
    fonction de liberation de la memoire alloué pour mes tableaux d'entier

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    char **deletePointer2(char **myPointer, int a, int b){
         int i;
     
         for (i=0; i < a; i++)
         {
             free(myPointer[i]);
         }         
         free (myPointer);
         myPointer = NULL;
         return myPointer;
    }
    fonction de conversion du tableau de flottant en entier (0/1):

    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
    int **MadjCreate(float **Cos, int *Size, float SEUIL){
    	int **TEMP;
    	int i, j;
    	TEMP = f2int(Size[0], Size[0]);/* la seg fault a lieu ici */
    
    	for(i = 0; i < Size[0]-1; i++){
    		for(j = 0; j < i; j++){
    			if (Cos[i][j] <= SEUIL)	TEMP[i][j] = 1;
    			else TEMP[i][j] = 0;
    			TEMP[j][i] = TEMP[i][j];
    		}
    	}
    	return TEMP;
    	TEMP = deletePointer2int(TEMP, Size[0], Size[0]);
    }
    merci à tout ceux qui pourront se pencher sur la question.

  2. #2
    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
    Tu as essayé en vérifiant les retours de malloc() ?
    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.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 47
    Par défaut
    oui j'ai essayé des choses du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (!(myPointer[i] = (int *)malloc (b * sizeof(int)))) erreur();
    mais seg fault et ça n'affiche pas le message d'erreur...

  4. #4
    Membre Expert Avatar de gnto
    Homme Profil pro
    Ingénieur système logiciel
    Inscrit en
    Janvier 2006
    Messages
    923
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur système logiciel
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2006
    Messages : 923
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int **f2int(int a, int b){
         int i;
         
         int **myPointer = (int **)malloc (a * sizeof(int*));
         for (i=0; i<a; i++)
             myPointer[i] = (int *)malloc (b * sizeof(int));
         return myPointer;
    }
    Je ne crois pas que le transtypage soit obligatoire.


    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
    int **MadjCreate(float **Cos, int *Size, float SEUIL){
    	int **TEMP;
    	int i, j;
    	TEMP = f2int(Size[0], Size[0]);/* la seg fault a lieu ici */
    
    	for(i = 0; i < Size[0]-1; i++){
    		for(j = 0; j < i; j++){
    			if (Cos[i][j] <= SEUIL)	TEMP[i][j] = 1;
    			else TEMP[i][j] = 0;
    			TEMP[j][i] = TEMP[i][j];
    		}
    	}
    	return TEMP;
    	TEMP = deletePointer2int(TEMP, Size[0], Size[0]);
    }
    Par contre la cette dernière ligne en rouge ne sert à rien si ce n'est qu'a faire jolie. Après un return, on sort de la fonction donc il ait peu de chance que ta dernière instruction soit executée

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 47
    Par défaut
    je viens de tester les modifications, malheureusement la seg fault est toujours là.
    Par contre je vais apporter une correction à mon premier post:
    l'erreur apparait en fait lors du premier appel de f2int:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    int main (int argc, char *argv[]){
            C = f2float(Size[0], Size[1]);
    	C = GetCoord(Mtab, Size);
    	Cos = CosCompute(C, Size);
    	C = deletePointer2float(C, Size[0], Size[1]);
    	printMCos(NVecteurs, Cos, Size);	
    	Madj = f2int(Size[0], Size[0]);/* ici */
    	Madj = MadjCreate(Cos, Size, SEUIL);
    	Madj = deletePointer2int(Madj, Size[0], Size[0]);
    	return 0;
    }
    ça n'est que lorsque je mets cette ligne en commentaire que la faute apparait à l'appel suivant de f2int:

    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
    int **MadjCreate(float **Cos, int *Size, float SEUIL){
    	int **TEMP;
    	int i, j;
    	TEMP = f2int(Size[0], Size[0]);/* ici */
    
    	for(i = 0; i < Size[0]-1; i++){
    		for(j = 0; j < i; j++){
    			if (Cos[i][j] <= SEUIL)	TEMP[i][j] = 1;
    			else TEMP[i][j] = 0;
    			TEMP[j][i] = TEMP[i][j];
    		}
    	}
    	return TEMP;
    	TEMP = deletePointer2int(TEMP, Size[0], Size[0]);
    }

  6. #6
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    C'est le genre de truc qu'un comilateur bien réglé signale tout de suite.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	return TEMP;
    	TEMP = deletePointer2int(TEMP, Size[0], Size[0]);
    Il faut absolument tester le retour de malloc (10000*10000*sizeof double ça fait quand même beaucoup !)
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  7. #7
    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
    Donc, une grosse mémoire leakée, et ce dans une boucle.
    Pour moi, il y n'y a pas de doute : Les malloc() finissent par échouer.
    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.

  8. #8
    Membre Expert Avatar de gnto
    Homme Profil pro
    Ingénieur système logiciel
    Inscrit en
    Janvier 2006
    Messages
    923
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur système logiciel
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2006
    Messages : 923
    Par défaut
    les erreurs de segmentation à l'allocation même c'est à dire pendant le malloc ne sont pas forcément du à l'instruction mais plutot au code antécédent.

  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
    À mon avis, ce n'est pas pendant les mallocs, c'est au retour d'un malloc() de la boucle: Le pointeur (sans doute nul) est affecté au pointeur nul retourné par le malloc() hors de la boucle ---> segfault.
    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 Expert Avatar de gnto
    Homme Profil pro
    Ingénieur système logiciel
    Inscrit en
    Janvier 2006
    Messages
    923
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur système logiciel
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2006
    Messages : 923
    Par défaut
    En fait j'ai deja eu un problème similaire je réallouais avec une taille inférieur et l'erreur de segmentation venait dans le malloc. Biensur le malloc ne pouvait rien retourné puisque ca se passer dedans. Donc je pense que tu as surement une erreur de segmentation avant mais que c'est lors du malloc que tu la vois

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 47
    Par défaut
    les erreurs de segmentation à l'allocation même c'est à dire pendant le malloc ne sont pas forcément du à l'instruction mais plutot au code antécédent.
    j'ai verifié tout le code antecedant, deroulé toutes les variables sur grandes et petites instances... il n'y a pas de probleme, je pense...

    À mon avis, ce n'est pas pendant les mallocs, c'est au retour d'un malloc() de la boucle: Le pointeur (sans doute nul) est affecté au pointeur nul retourné par le malloc() hors de la boucle ---> segfault.
    les test du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (!(myPointer[i] = (int *)malloc (b * sizeof(int)))) erreur();
    ne sont pas censés prevenir ce genre de probleme ? car quand je teste le malloc, je n'ai le message d'erreur mais, la seg fault directement...

  12. #12
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    Il faut se poser la question myPointer[i] est-il un pointeur valide ?
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  13. #13
    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
    Tu veux dire "myPointer est-il un pointeur valide ?", je suppose...
    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.

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 47
    Par défaut
    Citation Envoyé par Trap D
    Il faut se poser la question myPointer[i] est-il un pointeur valide ?
    j'ai fait les tests sur ces pointeur et je n'ai pas de message d'erreur, de plus j'ai utilisé ces fonction d'allocation dans d'autres programme sans que ça me génère de probleme... j'y comprends rien...

  15. #15
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    Citation Envoyé par Médinoc
    Tu veux dire "myPointer est-il un pointeur valide ?", je suppose...
    Tout à fait je me suis emmélé les pinceaux
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  16. #16
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14
    Par défaut
    au risque de dire une connerie myPointer[i] est aussi un pointeur vu que myPointer est un pointeur sur pointeur sur int, ou tableau de tableau.
    Donc un membre de ce tableau est aussi un pointeur ^^

    sinon ton programme est fait pour calculer des matrices carrées ? parceque tu utilise

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    TEMP = f2int(Size[0], Size[0]);
    donc 2 fois le meme int.
    Vérifie que c'est pas une erreur, et a premiere vue (mais j'ai peut etre loupé un truc plus loins) si tu as besoin que d'une valeur pourquoi tu t'emmerde avec un int * ? un int suffirait

  17. #17
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 47
    Par défaut
    oui ce sont des matrices carrées.
    par contre j'ai besoin de la totalité (Size[0]*Size[0]) de la matrice entière en int...
    ça fait trois jours que je cherche la connerie, je me suis décidé à refondre et epurer mon code au maximum, à l'essayer avec un autre compilo... et on verra bien...

  18. #18
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 47
    Par défaut
    apres avoir essayé pas mal de trucs et de bricolage mes malloc aboutissent toujours à une seg fault. Un ami m'a conseillé d'utiliser gdb pour detecter plus facilement mes erreurs, ce que j'ai fait. Le résultat est surprenant et incomprehensible du moins pour moi...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Program received signal SIGSEGV, Segmentation fault.
    0x400bd02f in chunk_alloc () from /lib/libc.so.6
    le résultat du bt:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #0  0x400bd02f in chunk_alloc () from /lib/libc.so.6
    #1  0x400bc9d0 in malloc () from /lib/libc.so.6
    #2  0x080492ed in f2int (a=323, b=323) at allocate.c:60
    #3  0x08048767 in Sim2Adj (Cos=0x80bf138, SEUIL=0.800000012) at MAdjAsem.c:59
    #4  0x08048983 in main (argc=3, argv=0xbffff844) at MAdjAsem.c:94
    #5  0x400601c4 in __libc_start_main () from /lib/libc.so.6
    en esperant que quelqu'un puisse me renseigner.

  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
    Là, GDB t'indique quel malloc() a provoqué l'erreur : c'est celui situé à la ligne 60 de allocate.c, dans la fonction f2int.

    Et là, visiblement, c'est bien dans le malloc() qu'a lieu l'erreur. Généralement, c'est signe d'une corruption du tas, due à une erreur antérieure.
    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.

  20. #20
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 47
    Par défaut
    y a t-il un moyen dans ce cas de connaitre la variable qui pose problème? parce que j'ai tout verifié et pas moyen de mettre le doigt sur cette erreur... je seche completement...

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

Discussions similaires

  1. Segmentation fault après malloc
    Par Nykoo dans le forum Bibliothèque standard
    Réponses: 2
    Dernier message: 16/12/2007, 17h08
  2. Malloc et segmentation fault sous Linux
    Par Del4king dans le forum C
    Réponses: 16
    Dernier message: 15/11/2006, 17h10
  3. [REDHAT] Segmentation fault systematique
    Par mela dans le forum RedHat / CentOS / Fedora
    Réponses: 2
    Dernier message: 21/09/2004, 06h05
  4. Réponses: 13
    Dernier message: 13/07/2004, 15h41
  5. Comment contrer la "segmentation fault" ?
    Par guillaume_pfr dans le forum C
    Réponses: 15
    Dernier message: 08/08/2003, 13h43

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