web-dev-qa-db-ja.com

Cobolでは、「nullまたはempty」をテストするために、「NOT = SPACE [AND / OR] LOW-VALUE」を使用しますか?どっち?

私は現在、メインフレームで、いくつかのモジュールで、テストするために働いています

Nullまたは空ではない

私たちは見る : NOT = SPACE OR LOW-VALUE首長は私たちがすべきだと言います:NOT = SPACE AND LOW-VALUE

どちらですか ?

ありがとう!

10
Tom

首長は正しいです。

COBOLは、自然言語のようなものを読むことを前提としています(これは、もう1つの悪い冗談であることがわかります)。

次の変数と値を試してみましょう。

 A = 1
 B = 2
 C = 3

次のような式:

IF A NOT EQUAL B THEN...

理解するのはかなり簡単です。 1は2と等しくないので、THENの後には何でもします。しかしながら、

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

追跡するのはかなり難しいです。ここでも、1は2に等しくなく、1は3に等しくないため、「THEN」に続くことは何でも行います。

COBOLには、IMHOを使用してはならない短い構造があります。だいたい誰もが混乱します(私も時々)。短い式では、上記を次のように減らすことができます。

IF A NOT EQUAL B AND C THEN...

または適用したい場合 De Morgansルール:

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

あなたへの私のアドバイスは、式でのNOTを避け、[〜#〜]決してしない[〜#〜]COBOLの短縮表記を使用することです。

あなたが本当に欲しいのは:

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

「X」にスペースまたは低い値(null)が含まれている場合、上記は何もしません。これは次とまったく同じです。

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

これは次のように変換できます。

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

そして最後に...

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

私のアドバイスは、COBOLでの長くて簡単な表現を理解するために単純に固執することです。

22
NealB

値nullは常に低い値と同じであるとは限らないことに注意してください。これは、デバイスアーキテクチャと、製造元が決定した使用中の文字セットによって異なります。メインフレームは、LinuxやWindowsを使用するデバイスと比べて、今までに見たことのないように、まったく異なる照合シーケンス(文字コードとシンボルの順序が低いものから高いもの)とシンボルセットを持つことができます。 Cobolで比較に使用される省略形は、IF A GOTO PAR-5やIF A OR C THEN ....などのブール演算に使用されることがあり、2つの変数の比較と組み合わせることができます。変数とリテラル値異なるデバイス上のパーサーとコンパイラーは、標準(ANSI)メソッドでこれらの状況を処理する必要がありますが、これは常に状況ではありません。

2
Developer

COBOLでは、Java nullのようなものはなく、「空」になることもありません。

たとえば、フィールドを取る

 05  FIELD-1  PIC X(5).

フィールドには常に何かが含まれます。

MOVE LOW-VALUES TO FIELD-1.

現在は6桁のゼロが含まれています。 x'0000000000 '

MOVE HIGH-VALUES TO FIELD-1.

現在、すべてのバイナリ1が含まれています:x'FFFFFFFFFF '

MOVE SPACES TO FIELD-1.

今、各バイトはスペースです。 x'4040404040 '

フィールドを宣言すると、それはメモリ内の特定の領域を指します。そのメモリ領域は何かに設定する必要があります。変更しない場合でも、プログラムがロードされる前にガベージが残っています。初期化しない限り。

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

私はNealBに同意します。シンプルに保ち、「ショートカット」を避け、マニュアルを参照して内容を確認しなくても理解しやすくします。

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

しかし、なぜXに88を入れて、それを本当にシンプルに保つのですか?:

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

Mainframe Cobolでは、NULLの意味は非常に制限されており、それに起因するものではありません、トム。 「空」は、特定のコーダーが生成したコンテキスト内の何かを意味するだけです(フィールドに関する限り、Cobolには何も意味しません)。

「文字列」はありません。したがって、「null文字列」(文字列終止符を含む長さ1の文字列)はありません。文字列がないため、フィールドには常に値があるため、プログラマーが指定した場合を除いて、フィールドが「空」になることはありません。

オグズ、あなたの投稿は、本当に単純なものをどれほど複雑にできるか、そしてそれがどのようにエラーにつながるかを説明していると思います。状態をテストしてもらえますか?

1
Bill Woodger