2010-11-04 86 views

Respuesta

19

Jefe es correcta.

COBOL es supone para leer algo así como el lenguaje natural (esto resulta ser simplemente otra mala broma).

Vamos a jugar con las siguientes variables y valores:

A = 1 
B = 2 
C = 3 

Una expresión como:

IF A NOT EQUAL B THEN... 

Es bastante sencillo de entender. Uno no es igual a dos, así que haremos lo que sea sigue el THEN. Sin embargo,

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

es mucho más difícil de seguir. De nuevo, uno no es igual a dos Y uno no es igual a tres, así que haremos lo que sigue al 'ENTONCES'.

COBOL tiene una construcción de mano corta que en mi humilde opinión nunca se debe utilizar. Confunde aproximadamente a todos (incluyéndome a mí de vez en cuando). expresiones de la mano cortos permiten reducir el anterior a:

IF A NOT EQUAL B AND C THEN... 

o si gustaría aplicar De Morgans rule:

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

Mi consejo es evitar NOT en exprssions y NUNCA uso COBOL mano corta expresiones.

Lo que realmente quiere es:

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

Lo anterior no hace nada cuando la 'X' contiene espacios o-bajos valores (valores nulos). Se es exactamente lo mismo que:

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

que se puede transformar en:

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

Y por último ...

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

Mi consejo es que se adhieren a simple entender más larga y recta hacia adelante expresiones en COBOL, olvidar la basura lado corto.

+0

Muchas gracias NealB! ;) – Tom

+0

En COBOL, hay muchas maneras de escribir condiciones como esta. Muchos de ellos conducen a la ambigüedad o mala interpretación.Estoy totalmente de acuerdo con el consejo de @NealB. –

2

Vale la pena señalar que el valor nulo no es siempre el mismo que el de bajo valor y esto depende de la arquitectura del dispositivo y su juego de caracteres en uso según lo determinado por el fabricante. Los mainframes pueden tener una secuencia de clasificación completamente diferente (un código de caracteres de bajo a alto y un orden de símbolos) y un conjunto de símbolos en comparación con un dispositivo que usa Linux o Windows como ya lo ha visto hasta ahora. La abreviatura utilizada en Cobol para las comparaciones a veces se usa para operaciones booleanas, como IF A GOTO PAR-5 y IF A OR C THEN .... y se puede combinar con comparaciones de dos variables o una variable y un valor literal. El analizador y el compilador en diferentes dispositivos deben tratar estas situaciones en un método estándar (ANSI), pero esta no es siempre la situación.

+1

Buen punto, 'LOW-VALUE' equivale al carácter de orden más bajo de la secuencia de clasificación actual. Esto suele ser cero binario (nulo) pero no tiene que serlo. En cuanto a 'IF A GOTO ...' el 'A' debe ser un nombre de nivel 88 para que esto sea válido (esto es COBOL después de todo). El difícil es 'SI A = B O C'. Si 'C' es un nombre de nivel 88, entonces significa' IF (A = B) O C'. Sin embargo, si 'C' no es un nombre de nivel 88, significa' IF (A = B) O (A = C) '. La única manera de saber con certeza cómo se declaró 'C' (esta es una de las" características "que hace que escribir los analizadores COBOL sea tan difícil). – NealB

1

Estoy de acuerdo con NealB. Mantenlo simple, evita los "atajos", hazlo fácil de entender sin tener que consultar el manual para verificarlo.

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

Sin embargo, ¿por qué no poner 88 en X, y mantenerlo muy 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 

Nota, en la unidad central Cobol, NULL es muy restringido en su significado, y no es el significado que se usted está atribuyéndolo, Tom. "Vacío" solo significa algo en un contexto particular generado por un codificador (no significa nada para Cobol en lo que respecta a un campo).

No contamos con "cadenas". Por lo tanto, no tenemos "cadenas nulas" (una cadena de longitud uno que incluye un terminador de cadena). No tenemos cadenas, por lo que un campo siempre tiene un valor, por lo que nunca puede estar "vacío", salvo que así lo indique el programador.

Oguz, creo que su publicación ilustra cuán complejo se puede hacer algo que es realmente simple, y cómo eso puede conducir a errores. ¿Puedes probar tus condiciones, por favor?

2

En COBOL, no hay nada Java nulo Y nunca está "vacío".

Por ejemplo, tome un campo

05 FIELD-1 PIC X(5). 

El campo será siempre contienen algo.

MOVE LOW-VALUES TO FIELD-1. 

ahora contiene hexadimal ceros. x'0000000000'

MOVE HIGH-VALUES TO FIELD-1. 

Ahora que contiene todos los binarios: x'FFFFFFFFFF'

MOVE SPACES TO FIELD-1. 

Ahora cada byte es un espacio. x'4040404040 '

Una vez que declara un campo, apunta a un área determinada de la memoria. Esa área de memoria debe configurarse en algo, incluso si nunca la modifica, todavía tendrá la basura que tenía antes de cargar el programa. A menos que lo inicialices.

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