2010-11-04 21 views

risposta

19

Il capo è corretto.

COBOL è presunto per leggere qualcosa di simile al linguaggio naturale (questo risulta essere solo un altro brutto scherzo).

Consente di giocare con le seguenti variabili e valori:

A = 1 
B = 2 
C = 3 

Un'espressione come:

IF A NOT EQUAL B THEN... 

È abbastanza semplice da capire. Uno non è uguale a due, quindi faremo lo seguendo lo THEN. Tuttavia,

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

È molto più difficile da seguire. Di nuovo uno non è uguale a due E uno non è uguale a tre, quindi faremo qualsiasi cosa segua il 'THEN'.

COBOL ha una struttura a mano corta che IMHO non dovrebbe mai essere utilizzato. Si confonde solo su tutti (incluso me di volta in volta). espressioni mano brevi consentono di ridurre quanto sopra a:

IF A NOT EQUAL B AND C THEN... 

o se si desidera applicare De Morgans rule:

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

Il mio consiglio è di evitare NOT in exprssions e MAI uso COBOL mano corta espressioni.

cosa si vuole veramente è:

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

È possibile che questo non fa nulla quando la 'X' contiene spazi o bassi valori (nulli). E è esattamente la stessa:

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

che può essere trasformato in:

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

E per finire ...

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

mio consiglio è di attenersi a semplici da capire più a lungo e dritto in avanti espressioni in COBOL, dimenticare il breve schifezza mano.

+0

Grazie mille NealB! ;) – Tom

+0

In COBOL, ci sono molti modi per scrivere condizioni come questa. Molti di loro portano ad ambiguità o errata interpretazione.Sono completamente d'accordo con il consiglio di @ NealB. –

2

Vale la pena notare che il valore null non è sempre uguale al valore basso e ciò dipende dall'architettura del dispositivo e dal suo set di caratteri in uso, come determinato dal produttore. I mainframe possono avere una sequenza di fascicolazione completamente diversa (codice dei caratteri da basso ad alto e ordine dei simboli) e un set di simboli rispetto a un dispositivo che usa linux o windows come sicuramente avrete visto. La stenografia utilizzata in Cobol per i confronti viene talvolta utilizzata per operazioni booleane, come IF A GOTO PAR-5 e IF A OR C THEN .... e può essere combinata con confronti di due variabili o una variabile e un valore letterale. Il parser e il compilatore su diversi dispositivi dovrebbero trattare queste situazioni in un metodo standard (ANSI), ma questa non è sempre la situazione.

+1

Buon punto, 'BASSO VALORE' equivale al carattere di ordine più basso della sequenza di fascicolazione corrente. Questo di solito è zero binario (null), ma non deve essere. Per quanto riguarda "IF A GOTO ..." il 'A' deve essere un nome di livello 88 per essere valido (questo è COBOL dopo tutto). Il difficile è "SE A = B O C". Se 'C' è un nome di livello 88 significa" IF (A = B) OR C ". Tuttavia se 'C' non è un nome di livello 88, significa' IF (A = B) OR (A = C) '. L'unico modo per sapere con certezza che è stato dichiarato 'C' (questa è una delle" caratteristiche "che rende difficile la scrittura dei parser COBOL ). – NealB

1

Sono d'accordo con NealB. Rendilo semplice, evita le "scorciatoie", rendilo facile da capire senza dover consultare il manuale per controllare le cose.

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

Tuttavia, perché non mettere un 88 su X, e tenerlo molto semplice ?:

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, in Mainframe Cobol, NULL è molto limitato di significato, e non è il significato che ti stai attribuendo, Tom. "Empty" significa solo qualcosa in un particolare contesto generato dal coder (non significa nulla per Cobol per quanto riguarda un campo).

Non abbiamo "stringhe". Pertanto, non abbiamo "stringhe nulle" (una stringa di lunghezza compresa un terminatore di stringhe). Non abbiamo stringhe, quindi un campo ha sempre un valore, quindi non può mai essere "vuoto" se non come definito dal programmatore.

Oguz, penso che il tuo post illustri quanto possa essere complesso qualcosa di veramente semplice, e come ciò possa portare a errori. Puoi testare le tue condizioni, per favore?

2

In COBOL, non esiste nulla come Java null E non è mai "vuoto".

Per esempio, prendete un campo

05 FIELD-1 PIC X(5). 

Il campo sarà sempre contenere qualcosa.

MOVE LOW-VALUES TO FIELD-1. 

ora contiene zeri esadimal. x'0000000000'

MOVE HIGH-VALUES TO FIELD-1. 

Ora contiene tutti quelli binari: x'FFFFFFFFFF'

MOVE SPACES TO FIELD-1. 

Ora ogni byte è uno spazio. x'4040404040 '

Dopo aver dichiarato un campo, punta a una determinata area in memoria. Quella area di memoria deve essere impostata su qualcosa, anche se non la modifichi mai, avrà comunque tutto ciò che immondizia aveva prima che il programma venisse caricato. A meno che non lo inizializzi.

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