🧩今日の学び
・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 と素直に歩く──これだけまず腹に落とせ。

コメント