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 Pascal Discussion :

IF THEN ELSE ou IF ELSE ELSE ?


Sujet :

Langage Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 1 644
    Par défaut IF THEN ELSE ou IF ELSE ELSE ?
    Bonjour,

    J'ai rencontré pour la première fois un phénomène étrange.

    Dans un test if Boolean1_var then exit else x := val; quelque soit l'état de Boolean1_var c'était toujours la branche else qui était prise (d'où l'intérêt d'un test ).
    En revanche if Boolean2_var then x := val else exit; fonctionnait parfaitement.

    Le débugger montre que l'expression est bien calculée mais le code assembleur laisse planner un doute avec une adresse dans rax également utilisé via al dans le test de condition.

    Quelqu'un a déjà eu ce problème ?

    Salutations

  2. #2
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 168
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 168
    Billets dans le blog
    9
    Par défaut
    Bonjour ! Très étrange en effet. Non, ça ne me rappelle rien.

  3. #3
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    8 051
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 8 051
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    Je m'interroge sur l'utilité d'une section else dans le test ? Soit l'instruction exit mettra fin à la routine, soit l'instruction x := val; sera exécutée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if Boolean1_var then 
      Exit;
    x := val;
    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
    La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]

  4. #4
    Membre émérite
    Homme Profil pro
    Chef de projets retraité
    Inscrit en
    Juillet 2011
    Messages
    452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Chef de projets retraité
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2011
    Messages : 452
    Par défaut
    Bonjour,

    Bon après plusieurs lectures, j'ai voulu tester (Windows 11 Lazarus 3.8 Free Pascal 3.2.2)
    Donc voici mon code :
    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
    Program IfThenElse;
     
    {$R *.res}
     
    Var
      x : Integer;
     
    Procedure LireUnBooleen (Boolean1Var : Boolean; Val : Integer);
    Begin
      if Boolean1Var then Exit
      else
        x := val;
    End;
     
    Procedure LireUnBooleen2 (Boolean2Var : Boolean; Val : Integer);
    Begin
      if Boolean2Var then x := val
      else
        Exit;
    End;
     
     
    Begin
     
      x := 10;
      LireUnBooleen(False, 1);
      WriteLn('Apres appel a False (1) : x = ', x);
      x := 11;
      LireUnBooleen(True, 2);
      WriteLn('Apres appel a True  (2) : x = ', x);
      x := 10;
      LireUnBooleen2(False, 1);
      WriteLn('Apres appel a False (1) : x = ', x);
      x := 11;
      LireUnBooleen2(True, 2);
      WriteLn('Apres appel a True  (2) : x = ', x);
     
      ReadLn;
     
    End.
    et voici les résultat en optimisation 4 (-O4)
    Apres appel a False (1) : x = 1
    Apres appel a True (2) : x = 11
    Apres appel a False (1) : x = 10
    Apres appel a True (2) : x = 2
    Je n'ai donc pas le phénomène que tu décris. Mais je n'ai pas tout ton programme...
    NB: Pour les puristes j'avais mis des accents dans mes textes mais je les ai enlevé car j'avais la flemme de chercher l'instruction qui met la console en UTF8
    EDIT 28/01/2025 : Bon, je l'ai retrouvé Il faut
    1/ Ajouter Windows aux uses (si pas déjà là)
    2/ Ajouter SetConsoleOutputCP(CP_UTF8); dans les premières lignes du programme

    Dans mon cas ça donne :
    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
    Program IfThenElse;
     
    uses
      windows;       // Pour la fonction Setconsoleoutputcp
     
    {$R *.res}
     
    Var
      x : Integer;
     
    Procedure LireUnBooleen (Boolean1Var : Boolean; Val : Integer);
    Begin
      if Boolean1Var then Exit
      else
        x := val;
    End;
     
    Procedure LireUnBooleen2 (Boolean2Var : Boolean; Val : Integer);
    Begin
      if Boolean2Var then x := val
      else
        Exit;
    End;
     
     
    Begin
      SetConsoleOutputCP(CP_UTF8);   // Pourla sortie en UTF8
     
      x := 10;
      LireUnBooleen(False, 1);
      WriteLn('Après appel à False (1) : x = ', x);
      x := 11;
      LireUnBooleen(True, 2);
      WriteLn('Après appel à True  (2) : x = ', x);
      x := 10;
      LireUnBooleen2(False, 1);
      WriteLn('Après appel à False (1) : x = ', x);
      x := 11;
      LireUnBooleen2(True, 2);
      WriteLn('Après appel à True  (2) : x = ', x);
     
      ReadLn;
     
    End.
    Ce qui fait en sortie :
    Après appel à False (1) : x = 1
    Après appel à True (2) : x = 11
    Après appel à False (1) : x = 10
    Après appel à True (2) : x = 2
    Fin EDIT

    Cordialement

  5. #5
    Membre Expert

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 1 644
    Par défaut
    Bonjour Alcatîz,

    Citation Envoyé par Alcatîz Voir le message
    ...Je m'interroge sur l'utilité d'une section else dans le test ? Soit l'instruction exit mettra fin à la routine...[/CODE]
    C'est exact, mais ce test était dans une entrée d'un case. L'écriture linéaire aurait nécessité un begin...end; pour ce cas ce qui n'est pas nécessaire avec le if...then...else sans qu'il y ait de coût supplémentaire. J'ai donc choisi la concision.

    Salut.

  6. #6
    Membre Expert

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 1 644
    Par défaut
    Bonjour,

    Ne vous cassez pas la tête là-dessus : contourner ce comportement n'est pas très difficile (le temps perdu avant de comprendre que le test ne testait rien fut quand même important). Je voulais seulement savoir si quelqu'un l'avait déjà rencontré.

    Merci.

    Salutations.

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

Discussions similaires

  1. [Débutant] if...then...else
    Par jive dans le forum ASP
    Réponses: 5
    Dernier message: 16/09/2005, 14h11
  2. [TagLib] Structure if then else
    Par mush_H dans le forum Taglibs
    Réponses: 5
    Dernier message: 19/07/2005, 15h31
  3. If Then Else
    Par Piout dans le forum MS SQL Server
    Réponses: 13
    Dernier message: 24/02/2005, 16h09
  4. IF THEN ELSE imbriqués
    Par nuke_y dans le forum Oracle
    Réponses: 2
    Dernier message: 15/11/2004, 14h57
  5. [CR 7] [débutante] pb avec if then else
    Par xs_nady dans le forum Formules
    Réponses: 8
    Dernier message: 28/05/2004, 15h36

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