【COBOL 読み1-23】スタートは0か1かでポパイvsブルータス

🧩今日の学び
・COBOL配列が1から始まるのは「自然言語の数え歌」文化が背景
・CT-COUNTRY(CT-IX) の“カッコ”は「引き出し番号」というCOBOLらしい概念
・0番目を作りたいという発想こそ、COBOL脳が現代エンジニアへ進化している証

今日のコード

           SET CT-IX TO 1
           PERFORM UNTIL CT-IX > 50
              IF CT-COUNTRY(CT-IX) NOT = SPACES
                 MOVE CT-SUM-GROSS(CT-IX) TO E-COUNTRY-GROSS
                 STRING
                    "  " CT-COUNTRY(CT-IX) " : "
                    DELIMITED BY SIZE
                    "ORDERS=" CT-COUNT(CT-IX) "  GROSS="
                    DELIMITED BY SIZE
                    E-COUNTRY-GROSS
                    DELIMITED BY SIZE
                 INTO OUT-REC
                 END-STRING
                 WRITE OUT-REC
              END-IF
              SET CT-IX UP BY 1
           END-PERFORM.

           MOVE "----------------------------------------------"
             TO OUT-REC
           WRITE OUT-REC.
           MOVE "END OF REPORT" TO OUT-REC
           WRITE OUT-REC.

           CLOSE INFILE OUTREP ERRFILE.

なるお)ついに終わりだ…

これが終わればCOBOLマスターの称号が天界からおりてくる。

だってね、もうこんなのやってきたことそのまんまだからー。楽勝だからー。
もう読まなくてもわかるってもん。見る必要もないってもん。

係長)なら全部説明してみろ。

な)なんで後ろにいるんだか…

           SET CT-IX TO 1
           PERFORM UNTIL CT-IX > 50
              IF CT-COUNTRY(CT-IX) NOT = SPACES
                 MOVE CT-SUM-GROSS(CT-IX) TO E-COUNTRY-GROSS
                 STRING
                    "  " CT-COUNTRY(CT-IX) " : "
                    DELIMITED BY SIZE
                    "ORDERS=" CT-COUNT(CT-IX) "  GROSS="
                    DELIMITED BY SIZE
                    E-COUNTRY-GROSS
                    DELIMITED BY SIZE
                 INTO OUT-REC
                 END-STRING
                 WRITE OUT-REC
              END-IF
              SET CT-IX UP BY 1
           END-PERFORM.

だって、こんなの、CT-IXに1をSETして、CT-IXが50以上になるまで、その下のIF系部分を動かしていき、処理が終わったらCT-IXに1足されて2になって、まだ50行ってないから次のやつー…

あのー係長?

 CT-SUM-GROSS(CT-IX) 

これなんでしたっけ?

係)前回も前々回もあったのに、勝手に抜かしておいて、今頃聞いてくるんだって言ってんだろ。

な)いやー、その時その時で係長が教えてくれれば、問題なかったんですよー。

俺は、崖から蹴り落とされもて登らないです!冷凍庫にアイスが入ってたら名前が書いてあっても食べます!たとえ社長のアイスであっても。

そのぐらい信念が強いんですって。

係)そんなもん信念言わんだろ。

そもそもなんで、社長のアイスが社員の冷蔵庫にはいってんだよ。

な)下々の気持ちを知りたいという社長のお気持ち表明?

係)なんでアイスでお気持ち表明になるんだよ。

っていいんだよ、そんなどうでもいいことは!

MOVE CT-SUM-GROSS(CT-IX) TO E-COUNTRY-GROSS

CT-SUM-GROSS(CT-IX) がわかってたら、こんなコードなんてことないだろうが。

もうMOVE TOはいいだろ。さすがに。わからなかったら、もう知らん。

な)それは大丈夫です。明日以降はわからないですが。明日は明日の風が吹くんで。

係)………

な)なんです…?

係)お前ってふざけないといられない質か?学校で違う意味での問題児だったんじゃないか?

な)なんすか、違う意味って!オレは正統派アイドルですって。聖子ちゃんカットですって。

係長は学校の廊下バイクで爆走してたんでしょ?スクールウォーズって実話ドラマで映像化されてましたよ。

はっ!あの暴走バイクは係長!? サインください!

係)ふざけないといられない質って言ったばかりだが⋯

話が進まんわ。

ここはこういうことになっている。

項目名役割中身
CT-COUNTRY(CT-IX)国コード例:“JP”
CT-COUNT(CT-IX)注文数例:12
CT-SUM-GROSS(CT-IX)総売上例:45800.00

このループでは、それを上から順に出してるだけだ。

配列(CT-COUNTRY)の正体:() は引き出し番号

CT-COUNTRY は テーブル(配列) なんだ。

COBOLでは「OCCURS 〜 TIMES」で定義したやつな。

こう定義してたはずだ

01  COUNTRY-TABLE.
    05  CT-COUNTRY     OCCURS 50 TIMES PIC X(2).
    05  CT-COUNT       OCCURS 50 TIMES PIC 9(5).
    05  CT-SUM-GROSS   OCCURS 50 TIMES PIC 9(9)V99.

で、CT-COUNTRY(CT-IX) は「配列の何番目か」を指してる。

CT-IX は インデックス変数(INDEXED BY CT-IX) で、今「50個あるテーブルのどこを見てるか」を示すカウンタみたいなもんだ。

COBOLでは (CT-IX) って丸括弧で書く。

つまり、() は要素アクセスの印なんだ。

な)あー、なるほど!
「CT-COUNTRY(CT-IX)」ってのは、「国リストの中のCT-IX番目」ってことか!

係)ちなみにCOBOLは1から始まるぞ。

1 → 2 → 3 … 50 まで進めながら、「国コードが入ってる行(SPACESじゃない)」を見つけたら、その国の集計データを出力してる。

な)つまり…「配列の何番目か」ってことですね。
関数呼び出しじゃなくて、箱の中のどの段かってことか。

係)そうだ。

COBOLのカッコは、引き出し番号

な)え、引き出し番号!
じゃあ CT-COUNTRY(CT-IX) は「CTの国棚のCT-IX段目のフォルダ」ってことですね!

係)お前のたとえ、毎回微妙に正しいのが腹立つんだよな…。

 1から始まる理由:COBOLは“数え歌”文化の言語

な)でも、0ないとか言ってましたけど、0の代わりにSpaceを入れたってことなんすかね。
0から始める場合はどうするんです?
もしかして0という存在を知らなかったとか!?インド知らなかったとか!?

係長、アメリカに染まってます?Are you fake American?

係)だれがフェイクだよ。お前は自称フェイクデブだろ。

COBOLは0を知らなかったわけじゃない
ちゃんと知ってる。むしろ0大好きだぞ。

じゃあなんで「1から」始まるのかって話な?

COBOLが作られたころ(1950年代末〜60年代初頭)、メモリってのは“箱の並び”として人が直接扱ってた。

で、「最初の箱」を指す番号をどうするか、って議論があったんだ。

当時のビジネス系の人たちは、

「最初は“1番目”って言うに決まってんだろ」っていう、

人間の感覚重視の発想だったわけ。

対して、科学屋・エンジニア側(後のC言語勢)の考え方は、
「メモリ上の位置はアドレス計算だから、最初は0で始まる方が理論的だろ」

でもCOBOLを設計したのは数学者じゃなくて会計屋と事務職の人たち
だから “自然言語的”な「1から始まる」が採用された。

な)つまり「技術」じゃなくて「おじさんの直感」ってことすね!
なんか怪しいですねー月商1億円1億円うるさい情報商材ぐらいの怪しさですね!

係)なんで、そんなの見てんだよ。

だがまぁ、そうだ。

COBOLは「forループ」より「数え歌」に近いんだよ。

いーち、にーい、さーん…って。


0番目を使いたい?COBOLでの裏技とそのリスク

な)でも、もし0番目を参照したらどうなるんです?

係)即エラーだ。

「存在しない引き出しを開けようとした」って怒られる。

COBOLはそういう無茶には超厳しい。

な)えー、てことは、0番を作る方法もないんすか?

係)ない。

もし“0番目”を使いたかったら、

1個余分に作っておいて0番っぽく扱うしかないぞ。

01 TABLE.
   05 DATA-ELEM OCCURS 51 TIMES.

として、「1〜50」が本番、「0番目」はダミー領域にするって手もあった。

でもそれは“裏技”だな。

おむすび

な)えぇ…なんか「COBOLは子どもにも分かる言語です」って言われてたわりに、意外と体育会系じゃないすか。

係)あぁ。

0から数える理系と、1から働かされる社会人の間にある言語——それがCOBOLだ。

な)社会人っていうか融通が利かないベテラン社員さん…?
あ、でも係長のことじゃないっすよ。

係)だったら、その一言いらねーだろ。

な)えー、だってちゃんと伝えないと怒るじゃないすかー。
報連相報連相うるさいじゃないすかー。ポパイっすか!?オリーブすか!ブルータスお前もか、ですか!?

係)報連相どこいったんだよ…

係長のワンポイント

配列の () は“引き出し番号”で、COBOLは必ず1から始まる言語だ。
CT-IX はインデックス変数で、今どの段を見ているかを指す“位置情報”そのもの。
CT-COUNTRY(CT-IX)・CT-COUNT(CT-IX)・CT-SUM-GROSS(CT-IX) はすべて同じ番号の段を読む設計だ。
0番を使う裏技はあるが、本番では“存在しない段を開ける”バグ誘発の危険が高い。
COBOLの配列は 1 → 2 → 3 と素直に歩く──これだけまず腹に落とせ。

― 目次(読みシリーズ)へ戻る ―

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする