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

Langage Delphi Discussion :

Explications de "while true do"


Sujet :

Langage Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de zazaraignée
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    3 174
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 3 174
    Par défaut Explications de "while true do"
    Bonjour

    Le principal est dans le titre.

    La source est dans http://nono40.developpez.com/sources/source0016/

    La raison de cette question: Je suis bloquée...

    Je dois expliquer le fonctionnement de ce code source pour un exercice que je dois remettre vendredi... Tant mieux si vous pouvez m'aider, autrement je m'organiserai. Aucune pression sur vous mes amis: après tout c'est mon problème!

    J'ai l'habitude de voir une condition clairement définie du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while (toto <= titi) do
    Alors comprenez ma surprise lorsque j'ai vu ceci
    comment sait-on qu'un jour la condition est fausse?

  2. #2
    Membre Expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 55
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Par défaut
    1) Effectivement, c'est bien une boucle sans fin
    2) Mais Nono40 à rajouté une instruction particulière dans la boucle : Exit;
    3) Il existe une deuxième instruction de ce genre, qui s'appelle Break;

    4) Exit et Break sont des sortes de Goto "déguisés" (Goto existe aussi en Delphi) que tu n'apprendras pas en cours d'informatique cars jugés non-académiques.

  3. #3
    Membre Expert

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Par défaut
    Tu ne sors d'une instruction de ce type que lorsqu'une instruction contenue de ce bloc fait une sortie explicite du style Exit (l'équivalent de break en C/C++/Java par exemple) et te renvoie alors à l'instruction juste qui suit ce bloc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ...
    while true do
    begin
    ...
    end; // while
    ...; // on arrive ici par un Exit (ou autre ?)

  4. #4
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 236
    Par défaut Re: SVP, Expliquez-moi "while true do"
    Citation Envoyé par zazaraignée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while (toto <= titi) do
    Alors comprenez ma surprise lorsque j'ai vu ceci
    comment sait-on qu'un jour la condition est fausse?
    Jamais, ceci est une boucle infinie, pour sortir d'un boucle de ce style, seul les commandes Exit, Application.Terminate, etc ... te permettront de la faire.
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  5. #5
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 236
    Par défaut
    Citation Envoyé par Magnus
    Tu ne sors d'une instruction de ce type que lorsqu'une instruction contenue de ce bloc fait une sortie explicite du style Exit (l'équivalent de break en C/C++/Java par exemple) et te renvoie alors à l'instruction juste qui suit ce bloc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ...
    while true do
    begin
    ...
    end; // while
    ...; // on arrive ici par un Exit (ou autre ?)
    Si je me souviens bien , Exit fait sortir completement de la fonction sans réalisé la suite du code contrairement à break qui lui permet de faire la suite du code

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    function toto : boolean;
    begin
      Result := True;
      while true do
        exit;
      Result := False;
    end;
    Resultat de toto = true

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    function toto : boolean;
    begin
      Result := True;
      while true do
        break;
      Result := False;
    Resultat de toto : False

    [edit] je confirme le fonctionnement de break et exit que j'ai montré plus haut je viens de tester[/edit]
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  6. #6
    Membre Expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 573
    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 573
    Par défaut
    Salut

    C'est un peu déroutant pour un pur pascalien mais c'est assez fréquent car cela peut aboutir à écrire moins de code, supposons que l'on ait un condition de sortie C et deux suites d'instructions A et B, le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    A;
    while not C do
    begin
      B;
      A;
    end;
    sera avantageusement remplacé par celui-ci (en terme de concision d'écriture et aussi de maintenance) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    while not C do
    begin
      A;
      if C then break;
      B;
    end;
    Cdlt

    e-ric

    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."

  7. #7
    Membre Expert
    Avatar de zazaraignée
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    3 174
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 3 174
    Par défaut
    Merci

    Je ne m'attendais pas à des réponses si rapides. Je reviens du forum VB où je traîne la plupart du temps.

    Je regarde la source de plus près pour vérifier le commentaire de waskol et je prédis qu'avant pas longtemps ce sera résolu

    @+

    Edit : Effectivement, y'a un Exit.
    Merci waskol!

  8. #8
    Membre Expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 55
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Par défaut
    Voici le code de Nono présenté de façon plus conventionnelle :

    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
    Function Partition(m,n:Integer):Integer;
      Var i,j,v:Integer;
            FinTri:boolean;
      Begin
        v:=Tab[m];
        i:=m-1;
        j:=n+1;
        FinTri:=false;
        While Not FinTri Do
        Begin
          Repeat Dec(j) Until Tab[j]<=v;
          Repeat Inc(i) Until Tab[i]>=v;
          If (i<j)
          Then Begin
            t:=Tab[i];
            Tab[i]:=Tab[j];
            Tab[j]:=t;
          End
          Else Begin
            Result:=j;
            FinTri:=True;
          End;
        End;
      End;

  9. #9
    Membre Expert
    Avatar de zazaraignée
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    3 174
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 3 174
    Par défaut
    Salut

    Merci encore

    Tu permets que je propose ton code comme alternative à mon prof, en spécifiant la source bien sur... de toute façon je viens de lui montrer ta réponse... il est juste derrière moi! Bon évidemment, j'aurais probablement trouvé toute seule, mais j'aime partager, la gloire aussi! 8)



    En passant, mon prof dit que lorsqu'il voit du code nécéssitant l'utilisation d'un break ou d'un exit, il a mal au yeux! Alors, imagine un goto!

  10. #10
    Membre Expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 55
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Par défaut
    Pas de problème, il est OpenSource

  11. #11
    Membre Expert
    Avatar de zazaraignée
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    3 174
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 3 174
    Par défaut
    Merci encore!

  12. #12
    Membre Expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 55
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Par défaut
    Citation Envoyé par zazaraignée
    En passant, mon prof dit que lorsqu'il voit du code nécéssitant l'utilisation d'un break ou d'un exit, il a mal au yeux! Alors, imagine un goto!
    Moi non, j'ai fait mes premiers pas en programmation sur un zx81, puis Oric Atmos : Le BASIC sans goto était alors inconcevable !

    Mais je le comprend...

    Cependant un petit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    begin
      if condition then Exit;
      //puis 50 lignes de code
    end;
    est parfois plus explicite qu'un super bloc begin..end ou la lecture du listing se trouve alourdi et fait effectivement mal aux yeux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    begin
      if not condition then
      begin
        //puis 50 lignes de code
      end;
    end;
    Edit : J'ai gardé la source d'un programme de MasterMind en Pascal, ou l'utilisation d'un Exit était réellement indispensable pour s'en sortir. (j'avais eu comme note 19,99/20 à cause du exit ). Si ton Prof est intéressé, je peux essayé de le retrouver.
    Le problème venait du fait que mon logiciel proposait les options suivantes :
    - avec/sans répétition de couleur pour la construction du code
    - avec placement sur les bonnes case ou non des jetons de notation noirs et blancs.

    Si je me souviens bien, le exit était placé dans la construction de la note (jetons blancs et noirs), lorsque les répétitions de couleur étaient autoriséées dans la combinaison.


    Sinon, c'est le seul cas d'absolue nécessité que j'ai rencontré en 20 ans de développement !

  13. #13
    Expert confirmé

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Par défaut
    Petit ajout : bien que je sois pour les break, exit, voire même goto quand ils se justifient, je présise que toute situation avec goto doit normalement pouvoir être transformée en une situation à boucle (avec éventuellement des break et/ou exit et une lecture difficile et peu logique) et que toute situation avec un break ou un exit peut être remplacée par le déclenchement d'une exception !
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  14. #14
    Membre Expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 573
    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 573
    Par défaut
    re-salut

    Je confirme la pensée de sjrd, en ce qui concerne l'utilisation des exit et break, pas de quoi se dresser les cheveux sur la tête, il n'y a qu'à voir certaines portions de la VCL pour se rendre compte que cela ne nuit ni à la qualité ni à la lisibilité du code bien au contraire. Mais c'est comme tout l'abus est nuisible, il faut savoir doser et surtout justifier intelligement les constructions employées.

    Je pense que ton professeur formalise un peu trop. Il faut rester pragmatique, les caractéristiques de qualité et d'efficacité du code ne se limitent pas à une simple approche syntaxique.

    cdlt

    e-ric

    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."

  15. #15
    Expert confirmé

    Avatar de Nono40
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    8 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 8 640
    Par défaut
    Citation Envoyé par waskol
    Voici le code de Nono présenté de façon plus conventionnelle :
    [...]
    Oui, effectivement. Je me souviens avoir adapter un code en C qui était avec ce style de boucle "infinie". Sauf qu'en C Return(valeur) sort de la fonction, la traduction la plus proche est donc bien Result:=Valuer;Exit;

    Sur un code fait maison, j'aurais sans doute pris la méthode de "fintri".

    Notez que Exit ne déroge pas aux code de finalization (contrairement au goto qui fait n'importe quoi) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Begin
      ShowMessage('Je passe ici');
      Try
        ShowMessage('Je passe ici');
        Exit;
        ShowMessage('Je ne passe pas ici');
      Finally
        ShowMessage('Je passe ici malgrès le exit');
      End; 
      ShowMessage('Je ne passe pas ici à cause du exit');
    End;
    Delphi :
    La F.A.Q. , 877 réponses à vos questions !
    264 sources à consulter/télécharger !

  16. #16
    Membre Expert
    Avatar de zazaraignée
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    3 174
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 3 174
    Par défaut
    Salut l'auteur du code

    T'en fais pas. Ton code a tout de même inpiré une exercice académique.

    Je conviens avec waskol qu'avec les anciennes techniques de programmation, Basic entre autres, pour s'en sortir il fallait tout un tas de goto et gosub, de exit et de break et même des return.

    Mais les langages ont évolués... et heureusement pour plus de clarté. Je ne crois pas briller par une excès d'intelligence. Alors j'aime le code clair, très commenté parce qu'après, quand j'y reviens, je ne veux pas passer des heures à décortiquer ce que j'avais programmé quelques mois, ou années plus tôt.

    Je me demandais, à propos de l'imbrication des procédures et fonction de ton code, ça vient de l'adaptation de ta source en C?

  17. #17
    Membre Expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 573
    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 573
    Par défaut
    Citation Envoyé par zazaraignée

    Alors j'aime le code clair, très commenté parce qu'après, quand j'y reviens, je ne veux pas passer des heures à décortiquer ce que j'avais programmé quelques mois, ou années plus tôt.
    C'est un état d'esprit louable qui ferait bien d'inspirer de nombreux développeurs (plus partisans du "après moi le déluge"), parole de développeur ayant fait pas mal de maintenance.

    cdlt

    e-ric

    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."

  18. #18
    Expert confirmé

    Avatar de Nono40
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    8 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 8 640
    Par défaut
    Citation Envoyé par zazaraignée
    Je me demandais, à propos de l'imbrication des procédures et fonction de ton code, ça vient de l'adaptation de ta source en C?
    Je ne me souvient plus si le code en C était aussi avec des sous-procédures. De toute façon c'est mieux ainsi dans tous les cas : les procédures Partition et FaitTri n'ont pas à être appelées en dehors de la procédure. En les disposant ainsi leur visibilité est limitée au coprs de la procédure FaitTri.
    Delphi :
    La F.A.Q. , 877 réponses à vos questions !
    264 sources à consulter/télécharger !

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 08/06/2007, 11h16
  2. Réponses: 2
    Dernier message: 19/11/2006, 10h54
  3. [Thread] Thread vs while(true)
    Par plutonium719 dans le forum Concurrence et multi-thread
    Réponses: 7
    Dernier message: 20/09/2006, 10h30

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