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 :

Problème de boucle while [Débutant]


Sujet :

C#

  1. #1
    Invité
    Invité(e)
    Par défaut Problème de boucle while
    Bonjour à tous,

    Je tiens à préciser que je suis totalement novice autour de la programmation en C#
    et je n'arrive pas à comprendre pourquoi un

    fait en sorte que ma boucle while fonctionne

    Mon programme permet de rechercher un mot dans un fichier txt et d'écrire la ligne associé. Si le mot existe plusieurs fois il devrait écrire la première ligne puis quand l'ulisateur clic sur suivant m'écrire la deuxième ligne etc...
    Le soucis étant que tant qu'il y a ce pop up (MessageBox) la boucle fonctionne mais le bouton suivant se fait court circuiter; et dès qu'il n'y est plus, impossible d'avoir les autres lignes Le programme réaffiche toujours la première ligne.

    Alors j'ai pensé à mettre une pause "attente d'un clic" mais toutes mes tentatives ont échoué pour que cela fonctionne.

    Mes questions sont donc:
    _Comment ce fait il qu'un MessageBox fasse réagir ma boucle comme ça ?
    _Auriez vous une piste pour que je puisse réalisé une "pause" afin d'attendre que l'utilisateur clic sur suivant ou reface une recherche ?

    Metallode689

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Afin que nous puissions t'aider, pourrais-tu nous fournir le code C# de ta fameuse boucle s'il te plait?

  3. #3
    Invité
    Invité(e)
    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
    20
    21
    22
    23
    while ((ligne = fichier1.ReadLine()) != null && counter <= 1000)
    {
         Match mat = Regex.Match(ligne, conver1, RegexOptions.IgnoreCase);
         If (mat.Success)
         {
             if (counter <= 1000)
             { 
                   Solution.Text = ligne;
                   MessageBox.Show("X");
                   t++;
              }
              else
              {
                   MessageBox.Show("erreur", exMessage);
              }
              counter++;
          }
          if ((mat.Success == false) && t == 0)
          {
              MessageBox.Show("Default introuvable bla bla bla");
              counter++;
          }
    }
    Ici la recherche fonctionne bien avec un afreux pop up qui apparait pour chaque ligne et court circuite par la même occasion la possibilité de pouvoir cliqué sur suivant
    le counter sera ensuite remplacé par une variable plus tard

  4. #4
    Invité
    Invité(e)
    Par défaut
    Dans ton code, je ne vois aucune interaction avec le bouton "suivant" que tu mentionnes... S'il n'y a pas d'interaction dans cette boucle avec le bouton "suivant", je ne vois pas comment ce que tu veux faire est réalisable.

    As-tu le reste du code de ton formulaire, et en particulier le code du Handler du bouton "suivant'?

  5. #5
    Membre chevronné
    Avatar de PixelJuice
    Homme Profil pro
    Ingénieur .NET & Game Designer
    Inscrit en
    Janvier 2014
    Messages
    641
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur .NET & Game Designer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2014
    Messages : 641
    Points : 2 154
    Points
    2 154
    Par défaut
    Le fichier que tu lis est-il volumineux ? Car si la boucle while s’éternise , il est normal que cela t'affiche la première ligne car l'interface est "freeze", et un MessageBox.Show() permet une attente ,la boucle continue uniquement si tu fermes la boite de dialogue.C'est pour cela que ça fonctionne quand t'en mets une.

    Essaye de donner le code complet qui concerne ce morceau de code.

  6. #6
    Invité
    Invité(e)
    Par défaut
    effectivement c'est parce que je n'ai pas trouvé le moyen de rajouter cette intéraction comme mentionné dans mon premier post

    il faudrait que ce while puisse se mettre en "pause" après un premier élément trouvé et que l'utilisateur puis reprendre la continuité de la boucle en cliquant sur suivant mais je n'ai pas trouvé comment réaliser cela.

  7. #7
    Membre chevronné
    Avatar de PixelJuice
    Homme Profil pro
    Ingénieur .NET & Game Designer
    Inscrit en
    Janvier 2014
    Messages
    641
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur .NET & Game Designer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2014
    Messages : 641
    Points : 2 154
    Points
    2 154
    Par défaut
    Citation Envoyé par metallode689 Voir le message
    effectivement c'est parce que je n'ai pas trouvé le moyen de rajouter cette intéraction comme mentionné dans mon premier post

    il faudrait que ce while puisse se mettre en "pause" après un premier élément trouvé et que l'utilisateur puis reprendre la continuité de la boucle en cliquant sur suivant mais je n'ai pas trouvé comment réaliser cela.

    Dans ce cas il faudrait que tu lises d'un coup ton fichier , que tu reprenne ton code mais en lisant dans un tableau ou une liste de string.

    Ensuite des que tu trouves quelque chose, la boucle se stop ,et tu reprends la recherche a l'aide d'un bouton.

    En gardant sa valeur , ta variable qui compte reprendra la ou la recherche s'est arrêtée.

  8. #8
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par PixelJuice Voir le message
    Le fichier que tu lis est-il volumineux ? Car si la boucle while s’éternise , il est normal que cela t'affiche la première ligne car l'interface est "freeze", et un MessageBox.Show() permet une attente ,la boucle continue uniquement si tu fermes la boite de dialogue.C'est pour cela que ça fonctionne quand t'en mets une.

    Essaye de donner le code complet qui concerne ce morceau de code.
    il n'est pas si volumineux que ça la boucle while ne s'éternise pas je dirais que lorsqu'il m'affiche la premiere ligne contenant le mot de recherche mon programme sort de sa boucle.

    je veux bien passer une plus grande partie du code mais il va falloir que je le tape (c'est compliqué je ne peux pas faire autrement ^^).

  9. #9
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par metallode689 Voir le message
    je dirais que lorsqu'il m'affiche la premiere ligne contenant le mot de recherche mon programme sort de sa boucle.
    Oui, c'est exactement ça qui se passe : toutes tes occurrences ont déjà été parcourues lorsque l'utilisateur peut cliquer sur le bouton "Suivant". C'est la raison pour laquelle un "MessageBox" arrête la boucle là où elle était.
    Il y a plusieurs solutions pour résoudre ce problème, comme par exemple :
    - Mettre une nouvelle fenêtre modale qui va arriver à chaque fois que l'un des mots est trouvé.
    - Parcourir tout et mettre les occurrences dans une liste, comme suggéré par pixeljuice
    - Ne pas faire de boucle mais retenir l'état du "match" actuel de la regex, et le faire avancer à chaque fois que l'utilisateur clique sur "suivant".

    Citation Envoyé par metallode689 Voir le message
    je veux bien passer une plus grande partie du code mais il va falloir que je le tape (c'est compliqué je ne peux pas faire autrement ^^).
    Ah bon? Tu n'as pas la possibilité de faire un "copié/collé" depuis ton poste?

  10. #10
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2013
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2013
    Messages : 35
    Points : 47
    Points
    47
    Par défaut
    Salut,

    effectivement un peu plus de code nous éclairerait car sur cette portion de code je ne vois pas ce qui cloche.
    Ton explication n'est pas super clair, mais selon ce que tu as dit j'aurais fait ça:

    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
           string ligne;
                string result;
                int counter=0;
                int t=0;
                string conver1="test";
                System.IO.StreamReader fichier1 = new System.IO.StreamReader(@"C:\test.txt");
                while ((ligne = fichier1.ReadLine()) != null && counter <= 1000)
                {
                    Match mat = Regex.Match(ligne, conver1, RegexOptions.IgnoreCase);
                     if (mat.Success)
                     {
                         t++;
                         result = ligne;
                         MessageBox.Show("Ligne : " +counter+ "\n\n Contenu :" + result + "\n\n" +t+"e occurence", "Recherche du mot : "+conver1 );
                     }
                counter++;
                }
                if ( t == 0)
                {
                    MessageBox.Show("Default introuvable bla bla bla");
                    counter++;
                }

    L: 10 : Retrait de ton 'if(counter<=1000)' (et donc du 'else' aussi), puisque c'est déjà une condition pour continuer ton while.
    J'ai sorti ton 'counter++' du if, comme ça il sert à compter les lignes. (Je ne voyais pas trop l'utilité de ce dernier dans le if, étant donné que tu as déjà ton 't' pour compte le nombre de mots trouvés.

    L:18: J'ai sorti le if ((mat.Success == false) && t == 0) de la boucle puisque sinon le fil d’exécution passe dedans tant qu'il n'a pas trouvé de mots, je ne vois pas l'intérêt.


    Mais alors: que veux-tu mettre à la place de ton messageBox ?


    Arnaud DS

  11. #11
    Invité
    Invité(e)
    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
    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
            private void Rechercher_Click(object sender, EventArgs e)
            {
                string conver1 = textBox1.Text;
                int t = 0;
                int counter = 0;
                //on vérifie s'il y a une valeur d'entrée ou non 
                if (conver1 != "")
                {
                     if (conver1.IndexOf(TextRecup1) != 0)
                    {
                        try
                        {
                            fichier1 = new StreamReader(@"C:\Users\user\Desktop\doc.txt");
                            while ((ligne = fichier1.ReadLine()) != null && counter <= 10000)
                            {
                                Match mat = Regex.Match(ligne, conver1, RegexOptions.IgnoreCase);
                                    if (mat.Success)
                                    {
                                        if (counter <= 10000)
                                        {
                                            Solution.Text = ligne;
                                            t++;
                                        }
                                        else
                                        {
                                            MessageBox.Show("Erreur", exMessage);
                                        }
                                        counter++;
                                    }
                                    if ((mat.Success == false) && counter == 10000 && t == 0)
                                    {
                                        MessageBox.Show("Defaut introuvable, Remonter l'information grâce au bouton approprié.");
                                    }
                                    counter++;
                             }
     
                        }
                        catch (Exception ex)
                        {
                        MessageBox.Show("Une erreur est survenue");
                        MessageBox.Show(ex.Message);
                        }
                        finally
                        {
                        }
                    }
                    else
                    {
                        MessageBox.Show("Defaut introuvable, Remonter l'information grâce au bouton approprié.");
                    }
                }
                if ( counter <= 0)
                {
                    MessageBox.Show("Taper un élément à rechercher");
                }
            }
    Ps: je repette je suis autodidacte et novice donc je pense que ce code peut etre simplifié et mieux écrit mais pour l'instant je cherche à ce que cela fonctionne




    Citation Envoyé par Ph_Gr Voir le message
    Oui, c'est exactement ça qui se passe : toutes tes occurrences ont déjà été parcourues lorsque l'utilisateur peut cliquer sur le bouton "Suivant". C'est la raison pour laquelle un "MessageBox" arrête la boucle là où elle était.
    Il y a plusieurs solutions pour résoudre ce problème, comme par exemple :
    - Mettre une nouvelle fenêtre modale qui va arriver à chaque fois que l'un des mots est trouvé.
    - Parcourir tout et mettre les occurrences dans une liste, comme suggéré par pixeljuice
    - Ne pas faire de boucle mais retenir l'état du "match" actuel de la regex, et le faire avancer à chaque fois que l'utilisateur clique sur "suivant".
    Merci pour vos pistes

    Ah bon? Tu n'as pas la possibilité de faire un "copié/collé" depuis ton poste?
    Pour l'histoire je suis au boulot, entreprise qui ne me permet pas d'avoir visual studio sur leur poste (sachant qu'il me demande de creer un programme chercher l'erreur [ironie]) je travail donc avec mon ordi personnel qui ne pas se connecter au réseaux de l'entreprise n'ayant pas de clé usb et ayant demandé à la moitier du service uné clé qu'ils n'ont pas. je dois faire en sorte de réécrire mon programme pour vous le montrer

  12. #12
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par metallode689 Voir le message
    Pour l'histoire je suis au boulot, entreprise qui ne me permet pas d'avoir visual studio sur leur poste (sachant qu'il me demande de creer un programme chercher l'erreur [ironie]) je travail donc avec mon ordi personnel qui ne pas se connecter au réseaux de l'entreprise n'ayant pas de clé usb et ayant demandé à la moitier du service uné clé qu'ils n'ont pas. je dois faire en sorte de réécrire mon programme pour vous le montrer
    Ah d'accord! Je comprend. Et il n'y a personne auprès de qui tu peux aller demander la possibilité d'installer au moins un visual studio express sur ton poste de travail? Vu qu'il s'agit d'un travail qu'ils te demandent d'un point de vue professionnel, je trouve que c'est la moindre des choses, non? Avec Visual Studio Express, il n'y a pas de pb de licence.

  13. #13
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par ArnaudDS Voir le message
    Mais alors: que veux-tu mettre à la place de ton messageBox ?
    Merci de ta réponse,

    à la place de mon MessageBox je souhaiterai mettre une interaction de l'utilisateur avec un bouton car l'utilisateur voit déjà sa recherche grace au Solution.Text = ligne.

  14. #14
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Ph_Gr Voir le message
    Ah d'accord! Je comprend. Et il n'y a personne auprès de qui tu peux aller demander la possibilité d'installer au moins un visual studio express sur ton poste de travail? Vu qu'il s'agit d'un travail qu'ils te demandent d'un point de vue professionnel, je trouve que c'est la moindre des choses, non? Avec Visual Studio Express, il n'y a pas de pb de licence.
    non le logiciel n'apparait pas dans le catalogue et le service info n'a pas voulu "acheter" ça pour un apprentie :/

  15. #15
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par metallode689 Voir le message
    non le logiciel n'apparait pas dans le catalogue et le service info n'a pas voulu "acheter" ça pour un apprentie :/
    Le catalogue? Ah tu es obligé de passer par un catalogue précis quand tu es à ton entreprise?

    VSE est gratuit et on peut le télécharger ici par exemple :
    http://www.microsoft.com/fr-fr/downl....aspx?id=40787

  16. #16
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Ph_Gr Voir le message
    Le catalogue? Ah tu es obligé de passer par un catalogue précis quand tu es à ton entreprise?

    VSE est gratuit et on peut le télécharger ici par exemple :
    http://www.microsoft.com/fr-fr/downl....aspx?id=40787
    je n'ai pas les droits administrateur pour installer quelconque programme sur l'ordinateur je ne peux même pas changer l'heure si j'en avais envie ^^

  17. #17
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par metallode689 Voir le message
    je n'ai pas les droits administrateur pour installer quelconque programme sur l'ordinateur je ne peux même pas changer l'heure si j'en avais envie ^^
    OK. Mais sinon tu peux toujours en parler à un administrateur, car en plus d'être gratuit, VSE peut être aussi utilisé dans un but lucratif.

  18. #18
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2013
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2013
    Messages : 35
    Points : 47
    Points
    47
    Par défaut
    Citation Envoyé par metallode689 Voir le message
    non le logiciel n'apparait pas dans le catalogue et le service info n'a pas voulu "acheter" ça pour un apprentie :/
    Ahah j'étais dans ce cas l'année dernière, la dure loi des stagiaires/apprentis... Mais tu devrais pouvoir demander l'installation de VSE au service IT de ta boîte, à t'entendre on dirait que tu bosses dans une cave en pédalant pour avoir du jus ... Tu dois être dans une grosse structure...

    Je comprends mieux ton problème maintenant. J'ai peut-être une solution alternative de la même veine que Ph_Gr:

    Vu que visiblement tu n'as pas de gros fichiers, tu fais d'abord un tour pour compter le nombre de lignes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    int nbLignes=0;
    string buff = "";
    while (buff != null)
    {
         buff = sr.ReadLine();
         if (buff == null) { break; }
         else {nbLignes++; }
    }
    Ensuite au lieu de faire un while, tu fais un "for" (globalement moi je n'utilise les while qu'en dernier recours, je trouve que les for c'est beaucoup plus pratique et moins plantable. Les for, c'est fort.) avec comme limite le 'nbLignes'. Seulement, dés que tu rencontres un 'Match', tu 'break' ton for, en prenant soin de récupérer la ligne où ça c'est arrêté.

    Ensuite tu mets une méthode derrière ton bouton "Suivant", qui relance un for à partir de la ligne où le for s'est arrêté (+1), etc...

    Arnaud DS

  19. #19
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par ArnaudDS Voir le message
    ...au lieu de faire un while, tu fais un "for" (globalement moi je n'utilise les while qu'en dernier recours, je trouve que les for c'est beaucoup plus pratique et moins plantable. Les for, c'est fort.)
    Ah oui, tout à fait d'accord, le "for" c'est le point fort de C#!

    Citation Envoyé par ArnaudDS Voir le message
    ...Seulement, dés que tu rencontres un 'Match', tu 'break' ton for, en prenant soin de récupérer la ligne où ça c'est arrêté.

    Ensuite tu mets une méthode derrière ton bouton "Suivant", qui relance un for à partir de la ligne où le for s'est arrêté (+1), etc...

    Arnaud DS
    C'est intéressant cette technique, mais en fait cette fonctionnalité existe déjà en .NET : il s'agit du mot clé "yield" avec comme possibilités "yield return" ou "yield break".

    L'idée c'est d'avoir une fonction qui renvoie un "IEnumerable" de quelque chose et c'est capté dans un "foreach" qui appelle la fonction.

    Exemple tout bête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    private IEnumerable<string> TestChaines()
    {
         yield return "chaine 1";
         yield return "chaine 2";
    }
     
    private void ParcoursDeChainesTest()
    {
         foreach(string str in TestChaines())
         {
               MessageBox.Show(str);
         }
    }
    C'est exactement la mise en œuvre de ton idée, mais assez simpliste. Après il suffit d'utiliser ce principe pour le problème d'ici.

  20. #20
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2013
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2013
    Messages : 35
    Points : 47
    Points
    47
    Par défaut
    Je ne connaissais pas cette technique! C'est sûr si on peut s'éviter de l'algo inutile...
    Comme quoi, Microsoft fais tout à notre place! Ils sont formidables.Sans montrer le code source par contre, du coup si ça ne marche pas impossible de savoir ce qui se passe réellement en background. . Mais, allez, ne crachons pas dans la soupe.

    @metallode689 : Si tu n'es pas super calé en itérateurs, algorithmique, je t'invite à faire ça en dur. Enfin, c'est ton choix, mais c'est toujours mieux de comprendre comment ça marche.

    @Ph_Gr : Par contre moi je prends!

    Arnaud DS

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

Discussions similaires

  1. Problème du boucle while en PHP
    Par kimpak dans le forum Langage
    Réponses: 6
    Dernier message: 11/08/2011, 13h28
  2. Problème de boucle while dans un popup
    Par drogba72 dans le forum Langage
    Réponses: 2
    Dernier message: 06/02/2009, 14h19
  3. [MySQL] Problème sur Boucle While après un LEFT JOIN
    Par matperino dans le forum PHP & Base de données
    Réponses: 12
    Dernier message: 28/05/2007, 17h43
  4. [MySQL] Problème de boucle while
    Par Justin_C dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 27/12/2006, 19h16
  5. [MySQL] Problème de boucle while sur base de données
    Par Darhyl dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 05/05/2006, 15h11

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