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

Cobol Discussion :

END-IF et '.'


Sujet :

Cobol

  1. #1
    Futur Membre du Club
    Inscrit en
    Mars 2007
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 12
    Points : 8
    Points
    8
    Par défaut END-IF et '.'
    Bonjour,

    Une petite question syntaxique : depuis Cobol 85, on peut utiliser les terminateurs d'instruction (END-If, END-PERFORM...) mais il reste toujours les '.' qui sont, en fait, des terminateurs de phrases. Normalement, on ne devrait pas mélanger les deux.

    Que se passe-t-il si, dans un bloc IF ... END-IF, une instruction se termine par un '.' ?

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    IF cond1
        IF cond2
    ...
        END-IF
    
        PERFORM PARA-1.
    
        IF cond3
    ...
        END-IF
    END-IF
    1. Est-ce que le "IF cond1" ne risque pas de s'arrêter au PERFORM ? Dans ce cas, il devrait y avoir une erreur de syntaxe avec le dernier END-IF, non ?

    2. Est-ce que le '.' est simplment ignoré par le compilateur ?

    Merci pour vos réponses.

    A+

  2. #2
    Membre du Club
    Inscrit en
    Juin 2007
    Messages
    60
    Détails du profil
    Informations personnelles :
    Âge : 60

    Informations forums :
    Inscription : Juin 2007
    Messages : 60
    Points : 62
    Points
    62
    Par défaut
    Salut

    Citation Envoyé par jeroc Voir le message
    1. Est-ce que le "IF cond1" ne risque pas de s'arrêter au PERFORM ?
    Il y a en effet de fortes chances pour que ce soit le cas. Le premier END-IF venant clore le IF cond2.

    Citation Envoyé par jeroc Voir le message
    Dans ce cas, il devrait y avoir une erreur de syntaxe avec le dernier END-IF, non ?
    En effet, le dernier END-IF n'a pas d'équivalent IF, la compile devrait te générer une erreur.

    Citation Envoyé par jeroc Voir le message
    Est-ce que le '.' est simplment ignoré par le compilateur ?
    $
    Non, surtout pas. Par contre, il n'en fait rien s'il n'en a pas besoin.
    Si la phrase se trouve au niveau élémentaire, pas d'usage.
    Si la phrase est imbriquée dans un IF, c'est le premier qui se présente ("." ou "END-IF") qui gagne.

    Pour ma part, je ne mets des points qu'avant le début des nouveaux paragraphes, pour clore le paragraphe précédent (minimum requis).
    Au sein d'un même paragraphe, jutilise les IF...END-IF, PERFORM...END-PERFORM, READ...END-READ, etc. mais n'utilise plus aucun point.
    Cela donne une meilleure maitrise et une plus grande clarté du code : avec des points un peu partout, on ne sait plus si on en a un de trop qui traine par contre, un END-IF de trop se voit plus facilement (avec une bonne indentation, c'est le paradis).

    A+

  3. #3
    Membre confirmé Avatar de Homer-ac
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    449
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 449
    Points : 586
    Points
    586
    Par défaut
    Faire confiance au compilateur. Si on laisse 'traîner' des points alors que l'on utilise les 'scope terminators' (End-....) le compilateur détectera une erreur de source. Code retour 8 en z-OS, de sorte qu'en principe le programme ne sera pas linkédité.
    Plus globalement, depuis la norme ANSI 85, l'idée est de généraliser ces scope terminators et d'abandonner au maximum l'utilisation des points pour évidemment mieux structurer ses programmes (l'essentiel de la norme ANSI 85 porte sur des ordres permettant de structurer les programmes).
    Ces points ne restent obligatoires depuis COBOL 2 en Procédure Division que sur la dernière instruction qui précède un nom de paragraphe (et après ces noms de paragraphes), j'ai personnellement fait le choix de ne plus en coder au profit des END-... et des instructions CONTINUE, sinon un point tout seul après la marge B, sur la ligne qui précède chaque nom de paragraphe. On y gagne en lisibilité et en risques d'erreurs.

  4. #4
    Membre confirmé Avatar de Homer-ac
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    449
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 449
    Points : 586
    Points
    586
    Par défaut
    désolé Fred, je n'avais pas ta réponse quand j'ai répondu dans le même temps

  5. #5
    Membre confirmé Avatar de Homer-ac
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    449
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 449
    Points : 586
    Points
    586
    Par défaut
    Faire confiance au compilateur. Si on laisse 'traîner' des points alors que l'on utilise les 'scope terminators' (End-....) le compilateur détectera une erreur de source. Code retour 8 en z-OS, de sorte qu'en principe le programme ne sera pas linkédité.
    Plus globalement, depuis la norme ANSI 85, l'idée est de généraliser ces scope terminators et d'abandonner au maximum l'utilisation des points pour évidemment mieux structurer ses programmes (l'essentiel de la norme ANSI 85 porte sur des ordres permettant de structurer les programmes).
    Ces points ne restent obligatoires depuis COBOL 2 en Procédure Division que sur la dernière instruction qui précède un nom de paragraphe (et après ces noms de paragraphes), j'ai personnellement fait le choix de ne plus en coder au profit des END-... et des instructions CONTINUE, sinon un point tout seul après la marge B, sur la ligne qui précède chaque nom de paragraphe. On y gagne en lisibilité et en risques d'erreurs.

  6. #6
    Futur Membre du Club
    Inscrit en
    Mars 2007
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 12
    Points : 8
    Points
    8
    Par défaut
    Donc, dans l'exemple que j'ai indiqué, le premier IF s'arrêtera au PERFORM PARA-1 car il est suivi d'un point et il y aura un message d'erreur du compilo quand il va trouver le dernier END-IF (correspondant au premier IF).

    Je suis bien d'accord avec vous qu'il vaut mieux utiliser les '.' uniquement où c'est strictement nécessaire et privilégier les scope terminateurs. Surtout qu'un '.' est un petit caractère difficile à voir... Exemple, une fois j'ai trouvé le genre de code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    IF cond
    MOVE A TO B MOVE B TO C. GOTO PARA-1.
    PERFORM PARA-2.
    Ici, un '.' a été malheureusement inséré lors de l'ajout de MOVE B TO C et le GOTO est sorti du IF. Il s'exécutait toujours et se qui suivait était en code mort. Cela a été difficile à trouver, d'autant plus que l'indentation était bonne...

    Merci pour vos réponses.

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

Discussions similaires

  1. [JDBC] [Oracle] Erreur : End of TNS data channel
    Par loicmillion dans le forum JDBC
    Réponses: 2
    Dernier message: 01/02/2005, 14h27
  2. Réponses: 2
    Dernier message: 15/04/2004, 15h44
  3. Erreur unexpected end of file
    Par snoop dans le forum Linux
    Réponses: 6
    Dernier message: 22/03/2004, 10h37
  4. questions sur le if then end if;
    Par ghostlord79 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 19/02/2004, 16h35
  5. Front End graphique pour GDB sous windows
    Par KORTA dans le forum GDB
    Réponses: 8
    Dernier message: 20/08/2003, 09h52

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