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

Windows Discussion :

Passage de tableau 2D en parametre de fonction


Sujet :

Windows

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 34
    Points : 16
    Points
    16
    Par défaut Passage de tableau 2D en parametre de fonction
    Bonjour à tous,
    Je développe un programme pour faire divers traitements sur des signaux.
    Je veux passer 3 tableaux à 2 dimensions chacun. Mais je n'arrive pas à les reprendre dans mon programme principal.
    Deux des tableaux sont des unsigned short à 90 ligne mais de colonne variable ( de 4 à 7)
    l'autre tableau est un tableaux de char de 20 ligne et du même nombre de colonne que les tableaux précédent. Dans mon sous-programme il sont bien sauvegardés car je les affiches avec une MessageBox et j'ai bien ce qu'il me faut. Mais je retrouve rien dans mon programme principal.
    Voici comment je les initialise dans mon sous programme :

    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
    amplitude_final=(unsigned short **)malloc(4*sizeof(unsigned short*));
    phase_final=(unsigned short **)malloc(4*sizeof(unsigned short*));
    Nom_signal=(char **)malloc(4*sizeof(char*));
    for(i=0; i<4; i++)
    	{
    	amplitude_final[i]=(unsigned short*)malloc(90*sizeof(unsigned short));
    	phase_final[i]=(unsigned short*)malloc(90*sizeof(unsigned short));
    	Nom_signal[i]=(char*)malloc(20*sizeof(char));
    	}
    for(i=0; i<4; i++)
    	{
    		for(int j=0; j<90; j++)
    			{amplitude_final[i][j]=0;
    			phase_final[i][j]=0;}
    			for(int j=0; j<20; j++)
    			Nom_signal[i][j]=0;
    			}
    Et voici comment je les initialise dans mon programme principal :

    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
    unsigned short **amplitude_tmp, **phase_tmp;	
    amplitude_tmp=(unsigned short **)malloc(4*sizeof(unsigned short*));
    phase_tmp=(unsigned short **)malloc(4*sizeof(unsigned short*));
    Nom_signal=(char **)malloc(4*sizeof(char*));
    for(int i=0; i<4; i++)
    {
    	amplitude_tmp[i]=(unsigned short*)malloc(90*sizeof(unsigned short));
    	phase_tmp[i]=(unsigned short*)malloc(90*sizeof(unsigned short));
    	Nom_signal[i]=(char*)malloc(20*sizeof(char));
    }
    	
    amplitude=(double*)malloc(90*sizeof(double));
    phase=(double*)malloc(90*sizeof(double));
    PAINTSTRUCT ps;		//Instrument pour effectuer un dessin
    HDC hdc;			//Identifiant de l'application
    static HWND hEdit;
    switch (uMsg)	//Suivant le message Windows
        {
    		case WM_COMMAND:
    		{	if(LOWORD(wParam) == IDM_OPENTDX)
    			 {	
    				 for(int i=0; i<4; i++)
    				{
    					for(int j=0; j<90; j++)
    					{amplitude_tmp[i][j]=0;
    					phase_tmp[i][j]=0;}
    					for(int j=0; j<20; j++)
    					Nom_signal[i][j]=0;
    				}
    			char* Nom_fichier;
    			Nom_fichier=(char*)malloc(200*sizeof(char));
    			int escap=browse_tdx(Nom_fichier);
    			if(escap==0) return 0; nb_signal=GSE(1,NULL,0,0,hinst,Nom_fichier,amplitude_tmp,phase_tmp,Nom_signal);
    			MessageBox(0,Nom_signal[0],"",0);
    		
    			}
    J'espère que vous pourrez m'aider.

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    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 382
    Points : 41 590
    Points
    41 590
    Par défaut
    Peux-tu poster un code non-abrégé?
    Je voudrais savoir exactement où est déclarée chaque variable et comment.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 34
    Points : 16
    Points
    16
    Par défaut
    Comment ça tu veux le code non-abrégé?
    Car on va dire qu'il fait plusieurs pages.

    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
    unsigned short   *phase;		// Sortie de la phase compactées 16bit.
    	unsigned short	*amplitude;		// Sortie de l'amplitude compactées 16bit.
    
    	FILE *FTestInput;		// Variable de type File servant à l'ouverture et à la lecture du fichier
    
    
    	phase=(unsigned short*)malloc(90*sizeof(unsigned short));	// 90 valeurs de phases
    	amplitude=(unsigned short*)malloc(90*sizeof(unsigned short));// 90 valeurs d'amplitude
    
    	int nb=0;
    	char *dossier;	//Variable pour les nom du dossier et du fichier à ouvrir
    	dossier=(char *)malloc(200*sizeof(char));	//Allocation memoire
    	//fichier=(char *)malloc(200*sizeof(char));	//Allocation memoire
    	for(i=0; i<200; i++)	//Initialisation
    	{	dossier[i]=0;}
    	//fichier[i]=0;}
    	// Initialisation des tableaux amplitudes et phases
    	for (i=0;i<90; i++)
    	{
    		amplitude[i]=0;
    		phase[i]=0;
    -
    -
    -
    -
    -
    switch (Mode)
    		{
    			case 1:
    			{	
    				amplitude_final=(unsigned short **)malloc(4*sizeof(unsigned short*));
    				phase_final=(unsigned short **)malloc(4*sizeof(unsigned short*));
    				Nom_signal=(char **)malloc(4*sizeof(char*));
    				for(i=0; i<4; i++)
    				{
    				amplitude_final[i]=(unsigned short*)malloc(90*sizeof(unsigned short));
    				phase_final[i]=(unsigned short*)malloc(90*sizeof(unsigned short));
    				Nom_signal[i]=(char*)malloc(20*sizeof(char));
    				}
    				for(i=0; i<4; i++)
    				{
    					for(int j=0; j<90; j++)
    					{amplitude_final[i][j]=0;
    					phase_final[i][j]=0;}
    					for(int j=0; j<20; j++)
    					Nom_signal[i][j]=0;
    				}
    				V1=(short*)malloc(121216*sizeof(short));		// taille du balayage pour V1
    				V2=(short*)malloc(121216*sizeof(short));		// taille du balayage pour V2
    				signalA=(short*)malloc(121216*sizeof(short));	// taille du balayage complet le plus long (4 émissions)
    				ref_spectre=(short*)malloc(2048*sizeof(short));	// taille du balayage complet du spectre de référence
    				
    				for(i=0; i<121216; i++)						//Remise en forme du signal vers les signaux respectifs
    				{	
    					V1[i]=(short)(signal_fichier[i]*8191/10);			//Mise en forme des signaux sur 14 bits	
    					V2[i]=(short)(signal_fichier[i+121216]*8191/10);
    					signalA[i]=V1[i]-V2[i];}						//Calcul du signal V1-V2
    
    				for(i=0; i<2048; i++)
    				ref_spectre[i]=signalA[i+128];
    
    				ApplyApoWin_Ref(ref_spectre,Nmoy);
    				Adapt_FFT(ref_spectre,Nmoy,amplitude,phase);
    				amplitude_final[0]=amplitude;
    				phase_final[0]=phase;
    				strcpy(Nom_signal[0],"Reference Spectre");
    				MessageBox(0,Nom_signal[0],"",0);
    				/*if(strcmp("Reference_Spectre",Nom_signal)==0)
    				{	amplitude_final=amplitude;
    				phase_final=phase;}*/
    				
    				ApplyApoWin(signalA,Nmoy);						// Application de la fenetre d'apodisation sur le signal en paramètre
    				Apply_DFT(signalA,Nmoy,amplitude,phase);		//Application de la DFT au signal passé en paramètre
    				amplitude_final[1]=amplitude;
    				phase_final[1]=phase;
    				Nom_signal[1]="Signal A";
    				MessageBox(0,Nom_signal[1],"",0);
    voila pour mon sous programme (pas dans le même fichier que la fonction main).

    Et voici mon main :

    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
    int  WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInst, LPSTR cmdline, int Show)
    
    {	
    	//unsigned short **amplitude_tmp, **phase_tmp;	
    	amplitude_tmp=(unsigned short **)malloc(4*sizeof(unsigned short*));
    	phase_tmp=(unsigned short **)malloc(4*sizeof(unsigned short*));
    	Nom_signal=(char **)malloc(4*sizeof(char*));
    	for(int i=0; i<4; i++)
    	{
    		amplitude_tmp[i]=(unsigned short*)malloc(90*sizeof(unsigned short));
    		phase_tmp[i]=(unsigned short*)malloc(90*sizeof(unsigned short));
    		Nom_signal[i]=(char*)malloc(20*sizeof(char));
    	}
    	 for(int i=0; i<4; i++)
    				{
    					for(int j=0; j<90; j++)
    					{amplitude_tmp[i][j]=0;
    					phase_tmp[i][j]=0;}
    					for(int j=0; j<20; j++)
    					Nom_signal[i][j]=0;
    				}
    	show=Show;		//Initialisation de la variable globale
    	hinst = hInstance;	//Initialisation de la variable globale
    	//MessageBox(0,cmdline,"",0);
    
    	//for(int i=0; i<90; i++)
    	//{	amplitude[i]=tmp_amplitude[i]*0.0205;	//Normalisation de l'amplitude en dB
    	//	phase[i]=tmp_phase[i]*360/4095;}		//Normalisation de la phase en degré
        MSG msg;		//Varaible de type message permettant d'intercepter les message windows
        WNDCLASSEX wc;		//Variable de type Windows permettant de créé la fentre
    
    	wc.cbSize = sizeof(WNDCLASSEX);	//On redimensionne la fenetre
    	HMENU hMenu;
    
    
        wc.style =CS_HREDRAW | CS_VREDRAW;	//Donne le style de la fenetre
        wc.lpfnWndProc = MainWndProc;		//Indique le programme à executer
        wc.cbClsExtra = 0;					//Allocation de memoire supplementaire pour la classe de la fentre
        wc.cbWndExtra = 0;					//Allocation de memoire supplementaire pour l'identifiant de la fentre
        wc.hInstance = hinst;				//Identifiant de la fenetre
        wc.hIcon =LoadIcon(hinst, (LPCTSTR)IDI_GSE_FINAL);	//Icone du point exe
        wc.hCursor = LoadCursor(NULL, IDC_ARROW);		//Curseur utiliser pour la fenetre	
        wc.hbrBackground = (HBRUSH)(1 + COLOR_BTNFACE);	//Arriere plan de la fenetre
        wc.lpszMenuName =  NULL;						//Nom de la variable du menu de la fentre
        wc.lpszClassName = "GSE-Data";					//Nom de la classe de la fenetre
    	wc.hIconSm		= LoadIcon(hinst, (LPCTSTR)IDI_SMALLGSE);	//Icone apparaissante dans le bandeau de la fenetre
    	
    	
        if(!RegisterClassEx(&wc)) return FALSE;		//Sert à mémorisser la classe 
    
    	
    	/////Creation de la fenetre d'application
        Frame = CreateWindow("GSE-Data", "Spectre et Phase du Signal", WS_SYSMENU|WS_BORDER,
          340,312, 600,400, NULL, NULL, hinst, NULL);
        if (!Frame)  return FALSE;	//Si impossible de créer la fentre retour au programme avec une erreur
    
        ShowWindow(Frame, show);	//Affichage de la fenetre
    	hMenu = LoadMenu(hinst, "Menu");
    	SetMenu(Frame, hMenu); 
    	UpdateWindow(Frame);		//Sert à rafraichir la fenetre
    
        while (GetMessage(&msg, NULL, 0, 0))	//Reception des messages Si message = WM_QUIT ->GetMessage==NULL
    	{
    		
    			TranslateMessage(&msg);	//Traduit le message de type WM_KEYDOWN en WM_CHAR
    			DispatchMessage(&msg);	//Envoyer le message à la procédure de fenêtre.
    
    	}
    	free(amplitude_tmp);
    	free(phase_tmp);
    	free(Nom_signal);
    Et le sous programme de mon main (dans le même fichier) :

    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
    LRESULT CALLBACK MainWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
    {
       
    	amplitude=(double*)malloc(90*sizeof(double));
    	phase=(double*)malloc(90*sizeof(double));
    	PAINTSTRUCT ps;		//Instrument pour effectuer un dessin
    	HDC hdc;			//Identifiant de l'application
    	static HWND hEdit;
        switch (uMsg)	//Suivant le message Windows
        {
    
    		case WM_COMMAND:
    		{	if(LOWORD(wParam) == IDM_OPENTDX)
    			 {	
    				char* Nom_fichier;
    				Nom_fichier=(char*)malloc(200*sizeof(char));
    				int escap=browse_tdx(Nom_fichier);
    				if(escap==0) return 0;
    				nb_signal=GSE(1,NULL,0,0,hinst,Nom_fichier,amplitude_tmp,phase_tmp,Nom_signal);
    				MessageBox(hwnd,Nom_signal[0],"",0);
    		
    			}
    
    			/*if(LOWORD(wParam) == IDM_OPENTXT)
    			 {
    				nb_signal=GSE(2,NULL,0,0,hinst,NULL,amplitude_tmp,phase_tmp,Nom_signal);
                 }*/
    			
    			if(LOWORD(wParam) == IDM_VISUAL)
    			{	
    			int numero_graph=DialogBox(hinst,(LPCTSTR)IDD_GET_GRAPH,NULL,(DLGPROC)GET_Graph);
    			}
    			break;
    		}
    J'espère que cela t'ira mais je n'ai pas pu tout mettre non plus sinon on s'y retrouverait pas.

  4. #4
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 412
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 412
    Points : 20 563
    Points
    20 563
    Par défaut
    Bonjour houlala je suis persuadé que tu as des tas de memory leaks dans ton programme !!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Nom_signal=(char **)malloc(4*sizeof(char*));
    Pourquoi réallouer à chaque fois 4 octets ? Et pourquoi faire à chaque fois des mallocs ???
    Si tu fais sans cesse des malloc() non seulement tu risques d'avoir des fuites de mémoire si tu ne gères pa rigoureusement cela avec des free() correspondants et en plus l'inconvénient de cela c'est que tu vas fragmenter ta mémoire inutilement.
    Si tu dois utiliser un tableau de 90 unsigned short il suffit de déclarer un tableau statique comme ceci unsigned short amplitude_final[90].

    Si tu n'est pas contraint par le système ( développement temps réel ) je te conseille vivement d'utiliser des conteneurs C++ cela simplifiera considérablement le code et pour la maintenance future et pour la relecture parce que avec la manière dont tu as bati ton code c'est ingérable....donc à maintenir tu risques d'avoir de sérieuses difficultés.

    Par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Nom_signal=(char **)malloc(4*sizeof(char*));
    peut s'écrire simplement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #include <string>
    std::string Nom_signal;
    Pour les tableaux à 2 dimensions tu peux utiliser std::map par exemple

  5. #5
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    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 382
    Points : 41 590
    Points
    41 590
    Par défaut
    @gofio79: Ton sous-programme ne compile pas: On ne sait pas où commence ou finit une fonction.

    @Mat.M: Tu es dans le décor. Il ne s'agit pas de 4 octets mais de 4 pointeurs.
    De plus, gofio79 n'a jamais dit qu'il bossait en C++ (même si vu le code, il est probable qu'il s'agisse de "C compilé en C++", vu qu'il y a des variables déclarées en milieu de bloc et des casts de malloc).

    @gofio79: Cherches-tu à programmer en C ou en vrai C++ ? Fais ton choix maintenant.

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 34
    Points : 16
    Points
    16
    Par défaut
    Je cherche a programmer en C mais je sais que au vue de mon programme on se pose la question.
    Sinon pour mon problème, j'ai passé mes variables en variable globale comme ça cela ne me gênera plus pour les récupérer, je sais bien que j'ai choisi la facilité mais je n'ai pas trop le temps.
    Merci pour votre aide

  7. #7
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    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 382
    Points : 41 590
    Points
    41 590
    Par défaut
    Je veux bien passer sur les variables globales si:
    1. Tu renommes tes fichiers de .cpp à .c et tu corriges les erreurs pour faire du vrai C
    2. Tu préfixes tes variables globales de g_ pour indiquer qu'il s'agit de variables globales.

  8. #8
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 412
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 412
    Points : 20 563
    Points
    20 563
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    @
    @Mat.M: Tu es dans le décor. Il ne s'agit pas de 4 octets mais de 4 pointeurs.
    De plus, gofio79 n'a jamais dit qu'il bossait en C++
    Oui je me suis trompé je m'en excuse effectivement c'est un tableau de 4 pointeurs.
    Mais si je me suis trompé c'est que le code est totalemet brouillon et confus d'ou le risque d'erreurs élevé

    Il ya des mallocs toutes les lignes je suis persuadé qu'il y a des tas de memory leaks en conséquence.

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 34
    Points : 16
    Points
    16
    Par défaut
    Qu'est ce que tu appelle des memory leaks?
    De toute façon je ne peux pas trop faire autrement sinon le compilateur me met des erreurs si je fait pas des mallocs.

  10. #10
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 412
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 412
    Points : 20 563
    Points
    20 563
    Par défaut
    Saluf Gofio79 il fallait le dire que tu débutes. ( quoique je me considère toujours comme un débutant )

    quel compilateur as-tu ?
    Une fuite de mémoire c'est quand tu alloues de la mémoire avec malloc en C , new en C++ et que tu n'appelles pas le free ou delete correspondant.
    Avec VC++6 et supérieur à l'exécution les memory leaks sont signalées si tu utilises certaines options

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 34
    Points : 16
    Points
    16
    Par défaut
    Ah d'accord je comprend maintenant. Mais c'est vrai que j'ai pas mal de fuite de memoire alors.
    J'utilise Visual C++ 2005.

Discussions similaires

  1. passage par référence d'un tableau en parametre de fonction
    Par crazykangourou dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 26/01/2009, 15h30
  2. [POO] passage nom objet dsn les parametres d'une fonction
    Par melou dans le forum Général JavaScript
    Réponses: 12
    Dernier message: 21/10/2005, 18h26
  3. Réponses: 13
    Dernier message: 13/10/2005, 17h03
  4. tableau dynamique en parametre d'une fonction
    Par drinkmilk dans le forum ASP
    Réponses: 4
    Dernier message: 27/04/2004, 17h35
  5. passage de tableau 2D a une fonction
    Par watashinoitadakimasu dans le forum C
    Réponses: 2
    Dernier message: 11/09/2003, 03h33

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