2010-11-04 29 views

Répondre

19

Le chef a raison.

COBOL est supposé pour lire quelque chose comme le langage naturel (cela s'avère être juste une autre mauvaise blague).

permet de jouer avec les variables et les valeurs suivantes:

A = 1 
B = 2 
C = 3 

Une expression telle que:

IF A NOT EQUAL B THEN... 

Est-ce assez simple à comprendre. On n'est pas égal à deux donc on va faire ce qui suit le THEN. Cependant,

IF A NOT EQUAL B AND A NOT EQUAL C THEN... 

Il est beaucoup plus difficile à suivre. Encore une fois n'est pas égal à deux ET on n'est pas égal à trois donc nous ferons tout ce qui suit le 'THEN'.

COBOL a une construction de la main courte que IMHO ne devrait jamais être utilisé. Il confond à peu près tout le monde (y compris moi de temps en temps). Courtes expressions de main vous permettent de réduire le dessus:

IF A NOT EQUAL B AND C THEN... 

ou si vous souhaitez appliquer De Morgans rule:

IF NOT (A EQUAL B OR C) THEN... 

Mon conseil pour vous est d'éviter NOT dans exprssions et JAMAIS utilisation COBOL main courte expressions.

Qu'est-ce que vous voulez vraiment est:

IF X = SPACE OR X = LOW-VALUE THEN... 
    CONTINUE 
ELSE 
    do whatever... 
END-IF 

Le fait ci-dessus rien lorsque le 'X' contient des espaces ou des faibles valeurs (NULLS). Il est exactement le même que:

IF NOT (X = SPACE OR X = LOW-VALUE) THEN 
    do whatever... 
END-IF 

qui peut être transformé en:

IF X NOT = SPACE AND X NOT = LOW-VALUE THEN... 

Et enfin ...

IF X NOT = SPACE AND LOW-VALUE THEN... 

Mon conseil est de rester à l'avant simple à comprendre et plus droites expressions en COBOL, oublier la merde main courte.

+0

Merci beaucoup NealB! ;) – Tom

+0

En COBOL, il y a beaucoup de manières d'écrire des conditions comme celle-ci. Beaucoup d'entre eux mènent à l'ambiguïté ou à une mauvaise interprétation.Je suis entièrement d'accord avec les conseils de @ NealB. –

2

Il est à noter que la valeur null n'est pas toujours la même que la valeur basse et cela dépend de l'architecture de l'appareil et de son jeu de caractères tel qu'il est déterminé par le fabricant. Les mainframes peuvent avoir une séquence de classement entièrement différente (code de caractères bas et haut et ordre des symboles) et un jeu de symboles comparé à un périphérique utilisant Linux ou des fenêtres comme vous l'avez sans doute déjà vu. Le raccourci utilisé dans Cobol pour les comparaisons est parfois utilisé pour les opérations booléennes, comme IF A GOTO PAR-5 et IF A ou C THEN .... et peut être combiné avec des comparaisons de deux variables ou une variable et une valeur littérale. L'analyseur et le compilateur sur différents périphériques doivent gérer ces situations dans une méthode standard (ANSI), mais ce n'est pas toujours le cas.

+1

Bon point, 'LOW-VALUE' équivaut au caractère d'ordre le plus bas de la séquence d'assemblage actuelle. Ceci est généralement binaire zéro (null) mais ne doit pas être. Comme pour 'IF A GOTO ...' le 'A' doit être un nom de niveau pour que ce soit valide (c'est COBOL après tout). Le difficile est «SI A = B OU C». Si 'C' est un nom de niveau 88, cela signifie' IF (A = B) OU C'. Cependant, si "C" n'est pas un nom de niveau 88, signifie "SI (A = B) OU (A = C)". La seule façon de savoir avec certitude comment vérifier 'C' a été déclaré (c'est l'une des" caractéristiques "qui rend l'écriture des analyseurs COBOL si difficile). – NealB

1

Je suis d'accord avec NealB. Restez simple, évitez les "raccourcis", facilitez la compréhension sans avoir à consulter le manuel pour vérifier les choses.

IF (X EQUAL TO SPACE) 
OR (X EQUAL TO LOW-VALUES) 
    CONTINUE 
ELSE 
    do whatever... 
END-IF 

Cependant, pourquoi ne pas mettre 88 sur X, et le garder très simple

?:
88 X-HAS-A-VALUE-INDICATING-NULL-OR-EMPTY VALUE SPACE, LOW-VALUES. 

IF X-HAS-A-VALUE-INDICATING-NULL-OR-EMPTY 
    CONTINUE 
ELSE 
    do whatever... 
END-IF 

Note, en Mainframe Cobol, NULL est très limité dans le sens, et n'est pas le sens que vous l'attribuez, Tom. "Vide" signifie quelque chose dans un contexte particulier généré par un codeur (cela ne signifie rien pour Cobol en ce qui concerne un champ).

Nous n'avons pas de "chaînes". Par conséquent, nous n'avons pas "null strings" (une chaîne de longueur, y compris string-terminator). Nous n'avons pas de chaînes, donc un champ a toujours une valeur, donc il ne peut jamais être "vide" autre que celui désigné par le programmeur.

Oguz, je pense que votre message illustre à quel point quelque chose de très simple peut être complexe, et comment cela peut conduire à des erreurs. Pouvez-vous tester vos conditions, s'il vous plaît?

2

En COBOL, il n'y a pas de Java NULL et il n'est jamais "vide".

Par exemple, prenez un champ

05 FIELD-1 PIC X(5). 

Le champ contiendra toujours quelque chose.

MOVE LOW-VALUES TO FIELD-1. 

maintenant il contient des zéros hexadimaux. x'0000000000'

MOVE HIGH-VALUES TO FIELD-1. 

Maintenant, il contient tous les binaires: x'FFFFFFFFFF »

MOVE SPACES TO FIELD-1. 

Maintenant, chaque octet est un espace. x'4040404040 '

Une fois que vous avez déclaré un champ, il pointe vers une certaine zone en mémoire. Cette zone de mémoire doit être paramétrée sur quelque chose, même si vous ne la modifiez jamais, elle aura toujours la même poubelle avant le chargement du programme. Sauf si vous l'initialisez.

05 FIELD-1 PIC X(6) VALUE 'BARUCH'.