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

Lazarus Pascal Discussion :

Erreur d'affectation de tableau bidimensionnel [Lazarus]


Sujet :

Lazarus Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juin 2010
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 44
    Par défaut Erreur d'affectation de tableau bidimensionnel
    Bonjour,

    Je travaille avec Lazarus sur un projet perso. Je souhaite remplir un tableau bidemensionnel avec des données récupérées depuis un objet TDBF.
    Voici ma procédure :
    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
    procedure Tf_menu.btn_searchClick(Sender: TObject);
    var
    	a_id_dem: Array of Array[1..2] of integer;
    	nb_dem:Integer;
    	i:Integer;
    	filtre_dem:String;
    begin
    	if Length(search.Text) > 2 then
    	begin
    		nb_dem := 1;
    		grid_demande.DataSource.DataSet.First;
     
    		while not grid_demande.DataSource.DataSet.EOF do
    		begin
    			if pos( uppercase( search.Text ), uppercase( grid_demande.DataSource.DataSet.FieldByName('sujet').AsString ) ) > 0  then
    			begin
    				a_id_dem[nb_dem][1] := grid_demande.DataSource.DataSet.FieldByName('annee').AsInteger;
    				a_id_dem[nb_dem][2] := grid_demande.DataSource.DataSet.FieldByName('id').AsInteger;
    				nb_dem := nb_dem + 1;
    			end;
     
    			if pos( uppercase( search.Text ), uppercase( grid_demande.DataSource.DataSet.FieldByName('descriptio').AsString ) ) > 0  then
    			begin
    				a_id_dem[nb_dem][1] := grid_demande.DataSource.DataSet.FieldByName('annee').AsInteger;
    				a_id_dem[nb_dem][2] := grid_demande.DataSource.DataSet.FieldByName('id').AsInteger;
    				nb_dem := nb_dem + 1;
    			end;
     
    			grid_demande.DataSource.DataSet.Next;
    		end;
     
    		filtre_dem := '';
     
    		For i := 1 to nb_dem do
    		begin
    			filtre_dem :=  filtre_dem + '(annee='+String(a_id_dem[i,1])+' and id='+String(a_id_dem[i,1])+') or ';
    		end;
    		grid_demande.DataSource.DataSet.Filtered := false;
    		grid_demande.DataSource.DataSet.Filter := filtre_dem;
    		grid_demande.DataSource.DataSet.Filtered := true;
    	end
    	else
    		showmessage('Veuillez saisir un texte à chercher (3 caractères minimum)');
    end;
    Le programme se compile sans erreur, mais à l'exécution, si je saisis du texte dans le composant "search" et que je clique sur le bouton "btn_search" le code parcours bien les éléments de mon TDBF (DataSet), dès qu'il rentre dans une condition if, j'ai une erreur :
    Nom : laz_error.jpg
Affichages : 210
Taille : 25,8 Ko
    L'erreur point sur la ligne où j'affecte la valeur au tableau ... mais sans plus de détail je n'arrive pas à voir d'où vient mon erreur ...

    Une idée ?

    D'avance merci

  2. #2
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 937
    Billets dans le blog
    6
    Par défaut
    Tu as "juste" oublié de définir la première dimension du tableau...
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  3. #3
    Membre averti
    Inscrit en
    Juin 2010
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 44
    Par défaut Merci
    Je ne connais pas d'avance la longueur du tableau ... et même en la forçant à 10 lors de la déclaration j'ai la même erreur ...
    Que me proposerais-tu comme syntaxe ?

  4. #4
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 142
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 142
    Par défaut
    Salut,
    Citation Envoyé par Benzouye Voir le message
    L'erreur pointe sur la ligne où j'affecte la valeur au tableau ... mais sans plus de détail je n'arrive pas à voir d'où vient mon erreur ...

    Une idée ?
    En l'état, surement pas : la boule de cristal est en panne d'essence, la pauvrette !

    Car c'est bien joli de nous balancer du code, mais tu ne nous dis pas quelle est la ligne concernée par l'erreur remontée dans ton message d'alerte, or il se trouve que, du peu qu'on peut en lire sur ta copie d'écran, il y a deux lignes concernées par cette erreur, deux lignes identiques :

    Citation Envoyé par Benzouye Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    			if pos( uppercase( search.Text ), uppercase( grid_demande.DataSource.DataSet.FieldByName('sujet').AsString ) ) > 0  then
    			begin
    				a_id_dem[nb_dem][1] := grid_demande.DataSource.DataSet.FieldByName('annee').AsInteger; // celle-ci
    				a_id_dem[nb_dem][2] := grid_demande.DataSource.DataSet.FieldByName('id').AsInteger;
    				nb_dem := nb_dem + 1;
    			end;
     
    			if pos( uppercase( search.Text ), uppercase( grid_demande.DataSource.DataSet.FieldByName('descriptio').AsString ) ) > 0  then
    			begin
    				a_id_dem[nb_dem][1] := grid_demande.DataSource.DataSet.FieldByName('annee').AsInteger; // et celle-là
    				a_id_dem[nb_dem][2] := grid_demande.DataSource.DataSet.FieldByName('id').AsInteger;
    				nb_dem := nb_dem + 1;
    			end;
    Le message te disait "ligne 104". C'est laquelle ?

    Et pour faire avancer le schmilblik, tu pourrais ajouter, avant chaque ligne, un appel à ShowMessage(IntToStr(grid_demande.DataSource.DataSet.FieldByName('annee').AsInteger;)); (si c'est possible : je ne suis absolument pas spécialiste des BdD's.)

    On arrive très bien à se rendre compte d'énormes bourdes à coups de ShowMessage judicieusement utilisés.

  5. #5
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 937
    Billets dans le blog
    6
    Par défaut
    Je ne sais pas si tu peux faire un simple SetLength(a_id_dem, nb_dem); mais il ne faut pas oublier dans ce cas que les tableaux dynamiques sont indicés à partir de zéro : un élément d'indice 0 au premier tour de boucle.

    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
    procedure Tf_menu.btn_searchClick(Sender: TObject);
    var
    	a_id_dem: Array of Array[1..2] of integer;
    	nb_dem:Integer;
    	i:Integer;
    	filtre_dem:String;
    begin
    	if Length(search.Text) > 2 then
    	begin
    		nb_dem := 1;
    		grid_demande.DataSource.DataSet.First;
     
    		while not grid_demande.DataSource.DataSet.EOF do
    		begin
                         SetLength( a_id_dem , nb_dem ); // dimensionne le tableau ; pour le libérer, fixer sa longueur à 0
    			if pos( uppercase( search.Text ), uppercase( grid_demande.DataSource.DataSet.FieldByName('sujet').AsString ) ) > 0  then
    			begin
    				a_id_dem[nb_dem-1, 1] := grid_demande.DataSource.DataSet.FieldByName('annee').AsInteger; // indices zero-based
    				a_id_dem[nb_dem-1, 2] := grid_demande.DataSource.DataSet.FieldByName('id').AsInteger;
    				nb_dem := nb_dem + 1;
    			end;
     
    			if pos( uppercase( search.Text ), uppercase( grid_demande.DataSource.DataSet.FieldByName('descriptio').AsString ) ) > 0  then
    			begin
    				a_id_dem[nb_dem-1, 1] := grid_demande.DataSource.DataSet.FieldByName('annee').AsInteger;
    				a_id_dem[nb_dem-1, 2] := grid_demande.DataSource.DataSet.FieldByName('id').AsInteger;
    				nb_dem := nb_dem + 1;
    			end;
     
    			grid_demande.DataSource.DataSet.Next;
    		end;
     
    		filtre_dem := '';
     
    		For i := 0 to nb_dem-1 do // indices zero-based
    		begin
    			filtre_dem :=  filtre_dem + '(annee='+IntToString(a_id_dem[i,1])+' and id='+IntToString(a_id_dem[i,1])+') or '; // IntToString, plutôt que String, non ?
    		end;
    		grid_demande.DataSource.DataSet.Filtered := false;
    		grid_demande.DataSource.DataSet.Filter := filtre_dem;
    		grid_demande.DataSource.DataSet.Filtered := true;
    	end
    	else
    		showmessage('Veuillez saisir un texte à chercher (3 caractères minimum)');
    end;
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  6. #6
    Membre averti
    Inscrit en
    Juin 2010
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 44
    Par défaut
    Citation Envoyé par Jipété Voir le message
    Le message te disait "ligne 104". C'est laquelle ?
    @Jipété : C'est vrai que la boule de cristal tourne en rond mais on pouvait voir la ligne en question sur la copie d'écran de l'erreur. C'est la première ligne d'affectation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    a_id_dem[nb_dem][1] := ...;
    @tourlourou : merci pour ces précisions sur la déclaration Array.
    J'ai donc modifié le code ainsi :
    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
    procedure Tf_menu.btn_searchClick(Sender: TObject);
    var
    	a_id_dem: Array of Array[1..2] of integer;
    	nb_dem:Integer;
    	i:Integer;
    	filtre_dem:String;
    begin
    	if Length(search.Text) > 2 then
    	begin
    		nb_dem := 0;
    		grid_demande.DataSource.DataSet.First;
     
    		while not grid_demande.DataSource.DataSet.EOF do
    		begin
    			if pos( uppercase( search.Text ), uppercase( grid_demande.DataSource.DataSet.FieldByName('sujet').AsString ) ) > 0  then
    			begin
    				nb_dem := nb_dem + 1;
    				SetLength( a_id_dem , nb_dem ); // On redimensionne le tableau au besoin
    				a_id_dem[nb_dem-1,1] := grid_demande.DataSource.DataSet.FieldByName('annee').AsInteger;
    				a_id_dem[nb_dem-1,2] := grid_demande.DataSource.DataSet.FieldByName('id').AsInteger;
    			end;
     
    			if pos( uppercase( search.Text ), uppercase( grid_demande.DataSource.DataSet.FieldByName('descriptio').AsString ) ) > 0  then
    			begin
    				nb_dem := nb_dem + 1;
    				SetLength( a_id_dem , nb_dem ); // On redimensionne le tableau au besoin
    				a_id_dem[nb_dem-1,1] := grid_demande.DataSource.DataSet.FieldByName('annee').AsInteger;
    				a_id_dem[nb_dem-1,2] := grid_demande.DataSource.DataSet.FieldByName('id').AsInteger;
    			end;
     
    			grid_demande.DataSource.DataSet.Next;
    		end;
     
    		filtre_dem := '';
     
    		For i := 1 to nb_dem do
    		begin
    			filtre_dem :=  filtre_dem + '(annee='+String(a_id_dem[i-1,1])+' and id='+String(a_id_dem[i-1,1])+') or ';
    		end;
    		showmessage( filtre_dem );
    		(*grid_demande.DataSource.DataSet.Filtered := false;
    		grid_demande.DataSource.DataSet.Filter := filtre_dem;
    		grid_demande.DataSource.DataSet.Filtered := true;*)
    	end
    	else
    		showmessage('Veuillez saisir un texte à chercher (3 caractères minimum)');
    end;
    Mais le résultat est presque pire puisque j'obtiens une erreur non positionnée (External: SIGSEGV) ... Et l'affichage de la fenêtre "Assembleur" sur une ligne incompréhensible au profane :
    Nom : laz_error.jpg
Affichages : 181
Taille : 36,7 Ko

    Pour compléter, j'ai simplifier au maximum la procédure pour retirer la gestion de base de données et ne laisser que le tableau :
    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
    procedure Tf_menu.btn_searchClick(Sender: TObject);
    var
    	a_id_dem: Array of Array[1..2] of integer;
    	nb_dem:Integer;
    	i:Integer;
    	filtre_dem:String;
    begin
    	nb_dem := 1;
    	SetLength( a_id_dem , nb_dem );
    	a_id_dem[nb_dem-1,1] := 2016;
    	a_id_dem[nb_dem-1,2] := 1;
     
    	filtre_dem := '';
     
    	For i := 1 to nb_dem do
    	begin
    		filtre_dem :=  filtre_dem + '(annee='+String(a_id_dem[i-1,1])+' and id='+String(a_id_dem[i-1,1])+') or ';
    	end;
            showmessage( filtre_dem );
    end;
    Même punition "External: SIGSEGV" avec adresse mémoire vu plus haut ...
    Si quelqu'un pouvait tester ce code et me dire si il a l'erreur ou pas ...

    Je suis perdu ...

  7. #7
    Membre Expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 568
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 568
    Par défaut
    Salut

    Le problème vient peut-être de la déclaration, je ne suis pas sûr que SetLength soit défini correctement pour les tableaux multidimensionnels, on ne précise en effet qu'une seule longueur, sur quelle dimension l'appliquer ? Essaie donc de te ramener à un tableau mono-dimensionnel avec un truc du genre:
    [code]
    a_id_dem: Array of record items: array[1..2] of integer; end;
    [code]
    Il faut modifier ensuite le code en conséquence :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ...
    a_id_dem[nb_dem-1].Item[1] := ...
    ...
    Fais un test, moi je ne peux pas.

    Cdlt

    M E N S . A G I T A T . M O L E M
    Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal

    "La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
    Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."

  8. #8
    Membre averti
    Inscrit en
    Juin 2010
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 44
    Par défaut
    Bon, c'est en effet un problème de déclaration.

    Voici ce que j'ai testé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    var
    	a_id_dem: Array[0..1,1..2] of integer;
    	i:Integer;
    	j:Integer;
    begin
    	a_id_dem[0,1] := 2016;
    	a_id_dem[0,2] := 1;
    	a_id_dem[1,1] := 2016;
    	a_id_dem[1,2] := 2;
     
            For i:=0 to 1 Do
                For j:=1 to 2 Do
                    showmessage( IntToStr(a_id_dem[i,j]) );
    end;
    Fonctionne (4 messages).

    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
    var
    	a_id_dem: Array of Array[1..2] of integer;
    	i:Integer;
    	j:Integer;
    begin
            SetLength(a_id_dem,2);
    	a_id_dem[0,1] := 2016;
    	a_id_dem[0,2] := 1;
    	a_id_dem[1,1] := 2016;
    	a_id_dem[1,2] := 2;
     
            For i:=0 to 1 Do
                For j:=1 to 2 Do
                    showmessage( IntToStr(a_id_dem[i,j]) );
    end;
    Fonctionne (4 messages).

    Vu que mon code est structuré selon la deuxième, j'en déduis que mon erreur portait sur les index passés au tableau ... J'ai repris mon code et cela fonctionne ...
    Pour mémoire :
    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
    procedure Tf_menu.btn_searchClick(Sender: TObject);
    var
    	a_id_dem: Array of Array[1..2] of integer;
    	nb_dem:Integer;
    	i:Integer;
    	filtre_dem:String;
    begin
    	if Length(search.Text) > 2 then
    	begin
    		nb_dem := 0;
    		grid_demande.DataSource.DataSet.First;
     
    		while not grid_demande.DataSource.DataSet.EOF do
    		begin
    			if pos( uppercase( search.Text ), uppercase( grid_demande.DataSource.DataSet.FieldByName('sujet').AsString ) ) > 0  then
    			begin
    				nb_dem := nb_dem + 1;
    				SetLength( a_id_dem, nb_dem );
    				a_id_dem[nb_dem-1,1] := grid_demande.DataSource.DataSet.FieldByName('annee').AsInteger;
    				a_id_dem[nb_dem-1,2] := grid_demande.DataSource.DataSet.FieldByName('id').AsInteger;
    			end;
     
    			if pos( uppercase( search.Text ), uppercase( grid_demande.DataSource.DataSet.FieldByName('descriptio').AsString ) ) > 0  then
    			begin
    				nb_dem := nb_dem + 1;
    				SetLength( a_id_dem, nb_dem );
    				a_id_dem[nb_dem-1,1] := grid_demande.DataSource.DataSet.FieldByName('annee').AsInteger;
    				a_id_dem[nb_dem-1,2] := grid_demande.DataSource.DataSet.FieldByName('id').AsInteger;
    			end;
     
    			grid_demande.DataSource.DataSet.Next;
    		end;
     
    		filtre_dem := '';
     
    		For i := 1 to nb_dem do
    		begin
    		     filtre_dem :=  filtre_dem + '(annee='+IntToStr(a_id_dem[i-1,1])+' and id='+IntToStr(a_id_dem[i-1,2])+') or ';
    		end;
    		grid_demande.DataSource.DataSet.Filtered := false;
    		grid_demande.DataSource.DataSet.Filter := copy( filtre_dem, 1, Length( filtre_dem )-4 );
    		grid_demande.DataSource.DataSet.Filtered := true;
    	end
    	else
    		showmessage('Veuillez saisir un texte à chercher (3 caractères minimum)');
    end;
    Merci pour votre participation

  9. #9
    Membre Expert

    Homme Profil pro
    au repos
    Inscrit en
    Février 2014
    Messages
    429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : au repos

    Informations forums :
    Inscription : Février 2014
    Messages : 429
    Par défaut
    Bonjour,

    j'en déduis que mon erreur portait sur les index passés au tableau ...
    ce n'est pas ton tableau qui créait l'erreur, mais bien l'usage de "string" au lieu "inttostr".

    remarque : lorsque tu crées un tableau dynamique, tu dois libérer la mémoire après son usage :

    Entièrement d'accord avec e-ric lorsqu'il te propose de travailler avec un record.

    Cordialement
    Thierry

  10. #10
    Membre averti
    Inscrit en
    Juin 2010
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 44
    Par défaut
    Merci pour le retour. Je ne voyais pas de différence majeure entre String() et IntToStr() ...

    Quels avantages à utiliser la syntaxe Array of Record plutôt que Array of Array ?

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 24/03/2016, 11h50
  2. Erreur d'affectation
    Par os_rasta dans le forum ASP
    Réponses: 5
    Dernier message: 21/03/2006, 15h41
  3. erreur de lecture de tableau incompréhensible
    Par Anouschka dans le forum C++
    Réponses: 2
    Dernier message: 27/01/2006, 13h40
  4. affecter un tableau à un autre
    Par pascaldengis dans le forum C
    Réponses: 2
    Dernier message: 23/11/2005, 17h54
  5. problème d'affectation de tableau ...
    Par Mike888 dans le forum C
    Réponses: 23
    Dernier message: 26/02/2005, 14h52

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