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 :

impossibilité a récupérer une donnée


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 7
    Par défaut impossibilité a récupérer une donnée
    Voila mon problème :
    j'ai fais le début de code suivant qui a pour but de gérer une base de donnée de 5 bibli qui contiennent 1000 livres maximum chacune.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
     
    #include<stdio.h>
    #include<string.h>
     
     
    /*structure modélisant un livre constituée de :
    o Un nom (30 caractères)
    o Un auteur (20 caractères)
    o Un ISBN (entier représentant l’identifiant du livre)*/
     
    typedef struct livre{
    	char nom[31];
    	char auteur[21];
    	int isbn;
    }LIVRE;
     
     
    /*structure modélisant une bibliothèque constituée de :
    o Un nom (50 caractères)
    o Un tableau de pointeurs statique de 1000 livres.
    o Le nombre de livres*/
    typedef struct bibliotheque{
    	char nom[51];
    	LIVRE* livres[1000];
    	int nbrlivres;
    }BIBLIO;
     
     
    /* Fonction de recherche d'un bibliothèque*/
    /*return NULL si la bibli n'est pas trouvé*/
    /*Sinon return l'adresse de la bibliothèque*/
    BIBLIO* rechercheBiblio(char nom[],BIBLIO tab[]){
    	int i;
    	for(i=0;i<5;i++){
    		if(strcmp(tab[i].nom,nom)==0)return &tab[i];
    	}
    	return NULL;
    }
     
    void add_livre(BIBLIO tab[]){
    	char nom[51];
    	LIVRE bouquin;
    	printf("Bibliotheque ou ajouter le livre\n");
    	scanf("%s",nom);
    	if(rechercheBiblio(nom,tab)==NULL){
    		printf("Desole la bibliothèque n'existe pas\n");
    		return;
    	}else{
    		printf("nom du bouquin ?");
    		scanf("%s",&bouquin.nom);
    		printf("auteur ?");
    		scanf("%s",&bouquin.auteur);
    		printf("ISBN ?");
    		scanf("%d",&bouquin.isbn);
    		rechercheBiblio(nom,tab)->livres[rechercheBiblio(nom,tab)->nbrlivres]=bouquin;
    		/*printf("%d",rechercheBiblio(nom,tab)->livres[rechercheBiblio(nom,tab)->nbrlivres]->isbn);*/
    		rechercheBiblio(nom,tab)->nbrlivres ++;
    	}		
    }
     
     
    /*fonction listant les livres présents dans une bibliothèque.*/
     
    void liste_livres(char nom[],BIBLIO tab[]){
    	int i;
    	if (rechercheBiblio(nom,tab)->nbrlivres==0)	{
    		printf("la bibliotheque est vide");
    		return;
    	}
    	printf("La bibli contient les livres :\n");
    	printf("%s\n",tab[0].livres[0]->nom);
    	for(i=0;i<2;i++){
    		printf("%s\n"rechercheBiblio(nom,tab)->livres[i]->nom);
    	}
    }
     
    int main(){
    	BIBLIO tab[4];
    	BIBLIO test1;
    	LIVRE temp;
    	char nom[51];
    	test1.nbrlivres=0;
    	strcpy(test1.nom,"biblii");
    	tab[0]=test1;
    	add_livre(tab);
    	strcpy(nom,"biblii");
    	printf("\n");
            	printf("%d",rechercheBiblio(nom,tab)->livres[rechercheBiblio(nom,tab)->nbrlivres]->isbn);
    	liste_livres(nom,tab);
    return 0;
    }
    j'ai donc commencer par faire une fonction de recherche de bibliothèque qui me retourne l'adresse de la bibliothèque(ceci m'a été demandé).

    Ensuite la fonction qui permet d'ajouter un livre dans une bibliothèque. C'est la que mon problème commence lorsque je test avec des printf tel que
    /*printf("%d",rechercheBiblio(nom,tab)->livres[rechercheBiblio(nom,tab)->nbrlivres]->isbn);*/
    dans la fonction pas de problème en revanche hors de ma fonction dans le main cela ne marche pas.
    Puis ma dernière fonction qui est censé afficher les livres de la bibli ne marche pas non plus.

    Dans les deux cas la meme erreur access violation.

  2. #2
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    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
     
     
    typedef struct bibliotheque{
    	char nom[51];
    	LIVRE* livres[1000];
    	int nbrlivres;
    }BIBLIO;
    ....
    void add_livre(BIBLIO tab[]){
    	char nom[51];
    	LIVRE bouquin;
    	printf("Bibliotheque ou ajouter le livre\n");
    	scanf("%s",nom);
    	if(rechercheBiblio(nom,tab)==NULL){
    ....
    	}else{
    ....
    		rechercheBiblio(nom,tab)->livres[rechercheBiblio(nom,tab)->nbrlivres]=bouquin;
    ....
    Cette dernière ligne est incorrecte :
    rechercheBiblio(nom,tab)->livres[....] est du type LIVRE* alors que bouquin est un LIVRE

  3. #3
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 7
    Par défaut
    Effectivement, cette erreur c'est glissé dans le copier coller du code.
    Mais cela me donne toujours access violation.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    #include<stdio.h>
    #include<string.h>
     
     
    /*structure modélisant un livre constituée de :
    o Un nom (30 caractères)
    o Un auteur (20 caractères)
    o Un ISBN (entier représentant l’identifiant du livre)*/
     
    typedef struct livre{
    	char nom[31];
    	char auteur[21];
    	int isbn;
    }LIVRE;
     
     
    /*structure modélisant une bibliothèque constituée de :
    o Un nom (50 caractères)
    o Un tableau de pointeurs statique de 1000 livres.
    o Que faut-il d’autres comme informations ?*/
    typedef struct bibliotheque{
    	char nom[51];
    	LIVRE* livres[1000];
    	int nbrlivres;
    }BIBLIO;
     
     
    /* Fonction de recherche d'un bibliothèque*/
    /*return NULL si la bibli n'est pas trouvé*/
    /*Sinon return l'adresse de la bibliothèque*/
    BIBLIO* rechercheBiblio(char nom[],BIBLIO tab[]){
    	int i;
    	for(i=0;i<5;i++){
    		if(strcmp(tab[i].nom,nom)==0)return &tab[i];
    	}
    	return NULL;
    }
     
    void add_livre(BIBLIO tab[]){
    	char nom[51];
    	LIVRE bouquin;
    	printf("Bibliotheque ou ajouter le livre\n");
    	scanf("%s",nom);
    	if(rechercheBiblio(nom,tab)==NULL){
    		printf("Desole la bibliothèque n'existe pas\n");
    		return;
    	}else{
    		printf("nom du bouquin ?");
    		scanf("%s",&bouquin.nom);
    		printf("auteur ?");
    		scanf("%s",&bouquin.auteur);
    		printf("ISBN ?");
    		scanf("%d",&bouquin.isbn);
    		rechercheBiblio(nom,tab)->livres[rechercheBiblio(nom,tab)->nbrlivres]=&bouquin;
    		/*printf("%d",rechercheBiblio(nom,tab)->livres[rechercheBiblio(nom,tab)->nbrlivres]->isbn);*/
    		rechercheBiblio(nom,tab)->nbrlivres ++;
    	}		
    }
     
     
    /*fonction listant les livres présents dans une bibliothèque.*/
     
    void liste_livres(char nom[],BIBLIO tab[]){
    	int i;
    	if (rechercheBiblio(nom,tab)->nbrlivres==0)	{
    		printf("la bibliotheque est vide");
    		return;
    	}
    	printf("La bibli contient les livres :\n");
    	printf("%s\n",tab[0].livres[0]->nom);
    	/*for(i=0;i<2;i++){
    		printf("%s\n",&(tab[0]).livres[i]->nom);
    	}*/
    }
     
    int main(){
    	BIBLIO tab[4];
    	BIBLIO test1;
    	LIVRE temp;
    	char nom[51];
    	test1.nbrlivres=0;
    	strcpy(test1.nom,"biblii");
    	tab[0]=test1;
    	add_livre(tab);
    	strcpy(nom,"biblii");
    	printf("\n");
    	printf("%d",rechercheBiblio(nom,tab)->livres[rechercheBiblio(nom,tab)->nbrlivres]->isbn);
    	liste_livres(nom,tab);
     
    system("pause");
    return 0;
    }
    Mon problème se trouve a la ligne
    printf("%d",rechercheBiblio(nom,tab)->livres[rechercheBiblio(nom,tab)->nbrlivres]->isbn);
    dans ma fonction main selon mon compilateur.

  4. #4
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Sauf que tu n'as pas le droit d'écrire ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void add_livre(BIBLIO tab[]){
    ....
    	LIVRE bouquin;
    ....
    rechercheBiblio(nom,tab)->livres[rechercheBiblio(nom,tab)->nbrlivres]=&bouquin;
    ....
    La raison est que bouquin est une variable locale qui sera détruite en sortie de la fonction. Tant que tu es dans la fonction, pas de problème, mais une fois dehors, tu as l'adresse d'une variable détruite. On ne doit jamais retourner d'une façon ou d'une autre l'adresse d'une variable locale.

    Solution : L'objet doit survivre à la sortie de fonction . Donc il faut le construire par allocation dynamique (malloc)

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par boubinou Voir le message
    Voila mon problème :
    j'ai fais le début de code suivant qui a pour but de gérer une base de donnée de 5 bibli qui contiennent 1000 livres maximum chacune.
    <...>
    Dans les deux cas la meme erreur access violation.
    Tu as défini un tableau de pointeurs sur livres, mais ces pointeurs ne sont jamais initialisé avec l'adresse d'un livre... Tu devrais travailler avec une orientation plus 'objet', de façon à laisser le code de bas niveau s'occuper des détails, ce qui te permet de te concentrer sur l'application.

    D'autre part, la fonction de recherche peut échouer. Il faut donc utiliser un pointeur intermédiaire et le tester avant usage. De plus, ce pointeur évite de rappeler plusieurs fois la fonction dans les mêmes conditions, ce qui est une perte de temps totalement injustifiable.

    Ceci compile, mais il faut reporter la correction que j'ai faite dans le fonction de recherche.. D'autre part, il faut contrôler qu'on ne dépasse pas la taille de tableaux.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
     
    #include<stdio.h>
    #include<string.h>
     
    /*structure modélisant un livre constituée de :
    o Un nom (30 caractères)
    o Un auteur (20 caractères)
    o Un ISBN (entier représentant l’identifiant du livre)*/
     
    typedef struct livre
    {
       char nom[31];
       char auteur[21];
       int isbn;
    }
    LIVRE;
     
    /*structure modélisant une bibliothèque constituée de :
    o Un nom (50 caractères)
    o Un tableau de pointeurs statique de 1000 livres.
    o Le nombre de livres*/
    typedef struct bibliotheque
    {
       char nom[51];
       LIVRE *livres[1000];
       int nbrlivres;
    }
    BIBLIO;
     
    /* Fonction de recherche d'un bibliothèque*/
    /*return NULL si la bibli n'est pas trouvé*/
    /*Sinon return l'adresse de la bibliothèque*/
    BIBLIO *rechercheBiblio (char nom[], BIBLIO tab[])
    {
       int i;
       for (i = 0; i < 5; i++)
       {
          if (strcmp (tab[i].nom, nom) == 0)
             return &tab[i];
       }
       return NULL;
    }
     
    void add_livre (BIBLIO tab[])
    {
       char nom[51];
       LIVRE bouquin;
       printf ("Bibliotheque ou ajouter le livre\n");
       scanf ("%s", nom);
       if (rechercheBiblio (nom, tab) == NULL)
       {
          printf ("Desole la bibliothèque n'existe pas\n");
          return;
       }
       else
       {
          printf ("nom du bouquin ?");
          scanf ("%s", bouquin.nom);
          printf ("auteur ?");
          scanf ("%s", bouquin.auteur);
          printf ("ISBN ?");
          scanf ("%d", &bouquin.isbn);
          {
             BIBLIO *p_bib = rechercheBiblio (nom, tab);
             if (p_bib != NULL)
             {
                p_bib->livres[p_bib->nbrlivres] = malloc (sizeof bouquin);
                if (p_bib->livres[p_bib->nbrlivres] != NULL)
                {
                   *p_bib->livres[p_bib->nbrlivres] = bouquin;
                   printf ("%d", p_bib->livres[p_bib->nbrlivres]->isbn);
                   p_bib->nbrlivres++;
                }
             }
          }
       }
    }
     
    /*fonction listant les livres présents dans une bibliothèque.*/
     
    void liste_livres (char nom[], BIBLIO tab[])
    {
       int i;
       if (rechercheBiblio (nom, tab)->nbrlivres == 0)
       {
          printf ("la bibliotheque est vide");
          return;
       }
       printf ("La bibli contient les livres :\n");
       printf ("%s\n", tab[0].livres[0]->nom);
       for (i = 0; i < 2; i++)
       {
          printf ("%s\n", rechercheBiblio (nom, tab)->livres[i]->nom);
       }
    }
     
    int main (void)
    {
       BIBLIO tab[4];
       BIBLIO test1;
       char nom[51];
       test1.nbrlivres = 0;
       strcpy (test1.nom, "biblii");
       tab[0] = test1;
       add_livre (tab);
       strcpy (nom, "biblii");
       printf ("\n");
       printf ("%d",
               rechercheBiblio (nom,
                                tab)->livres[rechercheBiblio (nom,
                                                              tab)->nbrlivres]->
               isbn);
       liste_livres (nom, tab);
       return 0;
    }
    Remarque : un numéro ISBN n'est pas une valeur numérique mais une chaine de caractères... (sinon, comment différencier 0123 de 123 ?)

  6. #6
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 7
    Par défaut
    Merci pour vos réponses cela m'a vraiment servi j'ai pas tout corriger encore donc je ne met pas résolu.

    Donc j'ai déjà corriger avec cette solution :

    Solution : L'objet doit survivre à la sortie de fonction . Donc il faut le construire par allocation dynamique (malloc)
    Merci diogene

    J'ai regardé pour les conseils de Emmanuel Delahaye

    En faite je ne pensai pas garder des tableaux fixes de 1000 livres mais faire des bibliothèques infinies en utilisant des tableaux dynamiques c'est pour cela que je n'ai pas initialisé et que n'ai pas vérifié si on dépasse la taille.

    Merci beacoup pour la remarque
    "un numéro ISBN n'est pas une valeur numérique mais une chaine de caractères... (sinon, comment différencier 0123 de 123 ?) ".
    Je n'y avais pas pensé.

    Il me reste a voir :
    D'autre part, la fonction de recherche peut échouer. Il faut donc utiliser un pointeur intermédiaire et le tester avant usage. De plus, ce pointeur évite de rappeler plusieurs fois la fonction dans les mêmes conditions, ce qui est une perte de temps totalement injustifiable.

  7. #7
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 7
    Par défaut
    Merci beaucoup d' avoir résolu mon problème par contre j'ai juste une question.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
          printf ("nom du bouquin ?");
          scanf ("%s", bouquin.nom);
          printf ("auteur ?");
          scanf ("%s", bouquin.auteur);
          printf ("ISBN ?");
          scanf ("%d", &bouquin.isbn);
    Je comprend pourquoi il faut mettre le & pour le dernier cas, mais pourquoi pas dans les deux premiers ?
    Cela serait-il dut au fait que c'est un tableau et que tout tableau est défini par son adresse de début ?

    En tous cas merci pour toute l'aide apportée.

  8. #8
    Membre éprouvé
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    142
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 142
    Par défaut
    Citation Envoyé par boubinou Voir le message
    Merci beaucoup d' avoir résolu mon problème par contre j'ai juste une question.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
          printf ("nom du bouquin ?");
          scanf ("%s", bouquin.nom);
          printf ("auteur ?");
          scanf ("%s", bouquin.auteur);
          printf ("ISBN ?");
          scanf ("%d", &bouquin.isbn);
    Je comprend pourquoi il faut mettre le & pour le dernier cas, mais pourquoi pas dans les deux premiers ?
    Cela serait-il dut au fait que c'est un tableau et que tout tableau est défini par son adresse de début ?

    En tous cas merci pour toute l'aide apportée.
    Il faut le mettre dans les 3 cas !

  9. #9
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    104
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 104
    Par défaut
    Je comprend pourquoi il faut mettre le & pour le dernier cas, mais pourquoi pas dans les deux premiers ?
    Cela serait-il dut au fait que c'est un tableau et que tout tableau est défini par son adresse de début ?
    C'est tout a fait ça ... Le prototype du scanf demande une adresse en argument. Les tableaux et les chaînes de caractères sont des pointeurs qui pointent sur le premier élément.

    équivaut à

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    int *tab;
    tab=(int*)malloc(5*sizeof(int));
    La différence est une question de déclaration statique dans le premier cas et dynamique dans le second.

    On s'aperçoit bien ici qu'un tableau est bien un pointeur.

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par FunK92 Voir le message
    Il faut le mettre dans les 3 cas !
    Certainement pas. Un nom de tableau est déjà l'adresse de son premier élément.

    Il faut revoir les bases du C.

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

Discussions similaires

  1. Réponses: 27
    Dernier message: 19/09/2006, 09h51
  2. Réponses: 11
    Dernier message: 13/07/2006, 16h15
  3. [VB6] Comment récupérer une donnée à travers un activeX ?
    Par ferry.jules dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 02/06/2006, 10h55
  4. Réponses: 1
    Dernier message: 18/04/2006, 23h16
  5. [EJBQL] Récupérer une donnée dans un EJB avec EJB/QL
    Par pblb62 dans le forum Java EE
    Réponses: 3
    Dernier message: 28/03/2006, 11h53

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