私は現在、メインフレームで、いくつかのモジュールで、テストするために働いています
Nullまたは空ではない
私たちは見る : NOT = SPACE OR LOW-VALUE
首長は私たちがすべきだと言います:NOT = SPACE AND LOW-VALUE
どちらですか ?
ありがとう!
首長は正しいです。
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での長くて簡単な表現を理解するために単純に固執することです。
値nullは常に低い値と同じであるとは限らないことに注意してください。これは、デバイスアーキテクチャと、製造元が決定した使用中の文字セットによって異なります。メインフレームは、LinuxやWindowsを使用するデバイスと比べて、今までに見たことのないように、まったく異なる照合シーケンス(文字コードとシンボルの順序が低いものから高いもの)とシンボルセットを持つことができます。 Cobolで比較に使用される省略形は、IF A GOTO PAR-5やIF A OR C THEN ....などのブール演算に使用されることがあり、2つの変数の比較と組み合わせることができます。変数とリテラル値異なるデバイス上のパーサーとコンパイラーは、標準(ANSI)メソッドでこれらの状況を処理する必要がありますが、これは常に状況ではありません。
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'.
私は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の文字列)はありません。文字列がないため、フィールドには常に値があるため、プログラマーが指定した場合を除いて、フィールドが「空」になることはありません。
オグズ、あなたの投稿は、本当に単純なものをどれほど複雑にできるか、そしてそれがどのようにエラーにつながるかを説明していると思います。状態をテストしてもらえますか?