COBOL言語の「DISPLAY文」は、ディスプレイ出力の為にある | 用語辞典

COBOL(コボル)言語の予約語DISPLAYを使った画面出力方法とは

辞典・辞書-DISPLAY-イメージ

COBOL(コボル)言語のDISPLAY文とは?

COBOL(コボル)言語のDISPLAY文は、文字通りディスプレイを含む出力装置を操作するための命令文です。
この命令文は、文字や数値などを端末(パソコンなど)の画面(ディスプレイ)に表示するために使われます。
作成したプログラムのデバッグや開発途中の処理確認などにも用いられ非常に使用頻度の高い命令文です。
そこで今回は、DISPLAY文の基本的な書き方から活用方法まで纏めてご説明します。

COBOL(コボル)言語のDISPLAY文-書き方と使用例

書き方1: (通常の画面出力)

DISPLAY
[表示変数名] UPON [出力するシステム名]
[WITH NO ADVANCNG]
END-DISPLAY

DISPLAY文は、「DISPLAY」~「END-DISPLAY」の中に処理を記述します。
[表示変数名]とは、ディスプレイ(表示)する内容が格納されている変数です。
変数とは、数値や文字などが入ったデータを扱うために名前をつけた物です。データ項目と同じ意味です。
[出力するシステム名]とは、表示変数名の内容を表示する装置名が入ります。
[WITH NO ADVANCNG]は、不要であれば省略できます。

使用例1:
辞典・辞書-DISPLAY-使用例1

実行結果1:
辞典・辞書-DISPLAY-実行結果1

使用例1のサンプルプログラムでは、出力装置に表示するための変数「OUTPUT-STR」と「OUTPUT-NUM」を定義し、そこへ命令文MOVEで文字列と数値を設定しています。
そして、設定した内容をDISPLAY文の「UPON」の後に記述した出力装置で出力(表示)します。

今回は、簡単な数値や文字列をディスプレイに表示するだけのプログラムなので、「CONSOLE」を指定しています。
CONSOLEとは、コンソール(操作卓)に出力することを意味しているもので、その他に「SYSOUT」(ハードウェアの標準出力装置)などを指定することができます。

実行結果では、変数に設定した文字や数値がそのまま出力されているのがわかります。
このように、変数の中に入っている内容や指定された文字・数値を出力(表示)させることがDISPLAY文の主な役割りになります。

書き方2: (呼び名指定の画面出力)

DISPLAY
[表示変数名] UPON [呼び名]
[WITH NO ADVANCNG]
END-DISPLAY

DISPLAY文は、「DISPLAY」~「END-DISPLAY」の中に処理を記述します。
[表示変数名]とは、ディスプレイ(表示)する内容が格納されている変数です。
変数とは、数値や文字などが入ったデータを扱うために名前をつけた物です。データ項目と同じ意味です。
[呼び名]とは、プログラム作成者が環境部の特殊名段落で指定した出力装置と関連付けた名前のことです。
[WITH NO ADVANCNG]は、不要であれば省略できます。

使用例2:
辞典・辞書-DISPLAY-使用例2

実行結果2:
辞典・辞書-DISPLAY-実行結果2

使用例2のサンプルプログラムでは、文字列変数「OUTPUT-STR」、数値変数「OUTPUT-NUM」、符号付きの数値変数「OUTPUT-NUM2」を定義し、そこへ命令文MOVEで文字列や数値などを設定しています。
そして、設定した内容をDISPLAY文の「UPON」の後に記述した呼び名を指定して出力(表示)します。

今回は、変数を用いない表意定数「ALL "Z"」や変数を用いない文字列「"ABCDE"」なども指定しました。
このように、直接文字列や表意定数を表示させることもDISPLAY文は可能です。
実行結果では、変数や直接指定した文字が正常に出力されているのがわかります。

使用例1との大きな違いは、「UPON」の後の指定にあります。使用例1では、直接「UPON」の後に出力する装置名「CONSOLE」を指定して出力していました。しかし、使用例2の呼び名を指定した画面出力方法では、環境部の特殊名段落で出力装置と任意の呼び名(プログラム作成者が付けた独自の名前)を定義して関連付けます。
そして、「UPON」の後に呼び名を指定することで、出力装置を呼び出して出力するのです。

使用例1と使用例2のサンプルプログラムは、両方共に同じ出力装置「CONSOLE」で表示されています。
では、一見回りくどい設定が必要な使用例2のような方法を用いず、使用例1のようにシンプルに直接出力装置を指定すればわかりやすく簡単で楽なように感じますが、すべてのハードウェア上で同じように出力装置が使えるとは限らないことに注意が必要です。
そこで、使用例2のように特殊名段落で出力装置と呼び名を関連付けて定義することで、もし別のハードウェア上でその出力装置が使用できない場合であっても、特殊名段落の呼び名と関連付けた出力装置の部分だけ変更すれば、対応することができます。
(使用例2の特殊名段落で「CONSOLE IS I-O-SYS」となっているところを、「SYSOUT IS I-O-SYS」とするだけで、「I-O-SYS」という呼び名を指定しているすべての部分に反映されます。)

これを利用して、他のハードウェア上へ移植しなければならない状況になったとしても大きく手を加える必要のない移植性の高いプログラムを作成することができます。

COBOL言語DISPLAY文の基本事項やルールについて

  1. COBOL(コボル)言語のDISPLAY文は、「UPON」の後に指定した出力装置で出力(表示)されます。
  2. 「UPON」指定をしない場合、ハードウェア装置の標準出力(SYSOUT)が指定されたものと認識されます。
  3. 呼び名を指定する時は、必ず環境部の特殊名段落で出力装置と関連付ける必要があります。
  4. DISPLAY文で表示される数値変数の内容は、外部10進数の場合はそのまま表示されます。
  5. DISPLAY文で表示される数値変数の内容が、外部10進数以外である場合(2進数、内部10進数など)、外部10進数に変換して表示します。
  6. 表意定数が領域を持つ変数を介さずDISPLAY文によって直接出力される場合、1回分だけを表示します。
  7. 「END-DISPLAY」は、COBOL2002年規格から追加されました。
    これは、DISPLAY文の終わりを明確に示すためのものです。しかし、必ず記述する必要はなく、以前のように不要であれば記述を省略することができます。記述しても記述しなくても処理事体は変わりません。
  8. DISPLAY文が指定された内容を一通り表示し終わると、出力装置は改行して左端に行位置を移します。
    行位置を改行させたくない場合、「WITH NO ADVANCNG」を指定することで、出力した最後の位置の直後で停止します。

COBOL(コボル)言語のDISPLAY文を使う上での注意点

DISPLAY文は、データ部で設定された値と同じ大きさの数値や文字列を出力する場合、そのまま表示します。
しかし、設定された値よりも出力するデータが大きい場合や小さい場合などは状況が変わってくるために、注意が必要です。
開発環境の違いやデータ部で設定された条件などにも左右されますが、処理の一例として下記をご覧ください。
出力するデータが設定した値よりも小さい場合、出力するデータが設定した値よりも大きい場合、形式の違うデータが出力された場合など様々な状況のディスプレイ出力の違いを見ることができます。

注意点画像:
辞典・辞書-DISPLAY-注意点画像

実行結果:
辞典・辞書-DISPLAY-実行結果

DISPLAY文は出力するデータが「正しい状態であるか」、という判別をしません。
上記、注意点画像の21~23行目の「STR4」「NUM5」「NUM6」の変数(データ項目)では、PICTURE句の変数(データ項目)内容で設定した数値以上のデータの大きさの内容を定義しています。

本来VALUE句では、PICTURE句の変数(データ項目)内容で設定した数値以上のデータの大きさの内容を定義してはいけないルールがありますが、DISPLAY文はこれを判別しませんので、左から順に出力処理しています。
(コンパイラによってはコンパイル時に、エラーを出すものもあります。)

また、29行目のMOVE文では、数値変数(項目)を文字変数(項目)にMOVE文で転記しています。
このような処理は、データの扱いが変化していることに注意が必要です。
「数値123」という内容が入った変数(項目)が、文字変数(項目)に転記され「文字列の123」と変化しています。
このように、データ上では変化した内容も実行した出力結果を見るだけでは、変化がわからない場合もあります。

ですので、DISPLAY文はデータの状態を検査しないことを念頭に、プログラム作成者は常にデータの状態を意識する必要があります。これを怠ると思わぬバグを生むことになります。

DISPLAY文は、データの内容を検査しません。常にデータの状態を意識しましょう。
前提として、PICTURE句で指定した大きさ以上のデータをVALUE句で定義することはやめましょう。
文字変数(項目)の内容を数値変数(項目)にMOVE文で転記すると、転記エラーで正常に転記されません。
数値変数(項目)の内容を文字変数(項目)にMOVE文で転記すると、文字列扱いになります。

DISPLAY文を使ったCOBOLプログラムの活用法

ここまでDISPLAY文の書き方や使用例をご紹介してきました。
また「COBOL(コボル)言語のDISPLAY文を使う上での注意点」では、気をつけるべき点も確認できたと思います。
しかし、開発途中のプログラムの出力結果やデータ状態を確認するために、何度もプログラムを書き換えるのは不便で効率的ではありません。
そこで、COBOL(コボル)言語ではデバッグ用の処理を記述することで、その記述がある間はデバッグモードとすることが可能です。
では、どのようにデバッグモードが使われるのか、DISPLAY文を使ってわかりやすいサンプルプログラムをご紹介いたします。

  1. IDENTIFICATION DIVISION.
  2. PROGRAM-ID. DISPLAY-SAMPLE04.
  3. ENVIRONMENT DIVISION.
  4. CONFIGURATION SECTION.
  5. *デバッグモードを定義
  6. SOURCE-COMPUTER. TEST1 WITH DEBUGGING MODE.
  7. OBJECT-COMPUTER. TEST1.
  8. *殊名段落で出力装置を定義
  9. SPECIAL-NAMES.
  10. CONSOLE IS I-O-SYS.
  11. DATA DIVISION.
  12. WORKING-STORAGE SECTION.
  13. 01 CON-DATA  PIC 9(3).
  14. 01 NUM-DATA PIC 9(3).
  15. 01 NUM-DATA2 PIC 9(3).
  16. 01 COMPUTE-DATA PIC 999.
  17. 01 MODULO PIC 9.
  18. PROCEDURE DIVISION.
  19. MAIN-PROCEDURE.
  20. * データの初期数値の設定
  21. COMPUTE NUM-DATA = 0.
  22. COMPUTE NUM-DATA2 = 0.
  23. COMPUTE CON-DATA = 0.
  24. * 100回処理を実行する
  25. PERFORM 100 TIMES
  26. * 1回転ごとに+1カウントする
  27. ADD 1 TO CON-DATA
  28. DIVIDE CON-DATA BY 2
  29. GIVING COMPUTE-DATA REMAINDER MODULO
  30. * カウントを割った余りの数値で、偶数と奇数を判別
  31. IF MODULO = 0
  32. * 偶数だった場合に、NUM-DATAにカウント数を転記
  33. MOVE CON-DATA TO NUM-DATA
  34. D DISPLAY NUM-DATA UPON I-O-SYS
  35. ELSE
  36. * 奇数だった場合に、NUM-DATA2にカウント数を転記
  37. MOVE CON-DATA TO NUM-DATA2
  38. * DISPLAY UM-DATA2 UPON I-O-SYS
  39. END-IF
  40. END-PERFORM.
  41. STOP-RUN.
  42. END PROGRAM DISPLAY-SAMPLE04.

サンプルプログラムでは、デバッグモードで実行処理中はDISPLAY文でNUM-DATAの内容を表示させています。
環境部の「SOURCE-COMPUTER」で「WITH DEBUGGING MODE」を指定し、標識領域でD(デバックモードを示します。)と明記することで、デバッグモードを実行させることができます。
このプログラムは、PERFORM文で100回処理を実行させて奇数回転と偶数回転を判別し、条件分岐させるための簡単なプログラムですが、デバッグモードのDISPLAY文で1回転ごとに出力することで、正常に条件分岐処理が実行されていることを確認することができます。

今回は、偶数回転の方の確認をするために、NUM-DATA側のDISPLAY文にD(デバッグモード)をつけていますが、NUM-DATA2の方にDをつければ奇数回転の処理をデバッグ確認することが可能です。

デバッグが終了して不要になれば、「WITH DEBUGGING MODE」の記述を削除することで、デバッグモードを解除できます。

Dと記述した行は注記(コメント)と同様に扱われるので、コンパイルの対象外となります。ですので、必要な時にのみ「WITH DEBUGGING MODE」を指定することで、いつでも効率的にデバッグをすることができるのです。

プログラムを作成する上で、バグを出さないことは非常に重要なことです。このように、デバッグモードを活用し小まめに処理確認をすることがバグを出さない1つの条件といえます。

この記事を読んだ人は、こちらの記事も読んでいます

【未経験者歓迎】COBOLプログラマー・システムエンジニアの募集

株式会社COBOLの求人・転職・募集情報を見る

COBOL入門のカテゴリー

取引企業様 募集中
COBOL技術者 募集
COBOL魂
読者採用
COBOL入門