🧩今日の学び
・COBOLの変数は宣言しただけでは中身が保証されないため、MOVEで初期化する必要がある
・係長の説明どおり、箱を作っただけでは中身は決まらずメモリの残骸が残る可能性がある
・次回は変数と計算処理を組み合わせて、もう少し実践的なプログラムを書いていく
係長)それでなにを足すんだ?
なるお)え?何って、世の中には甘みが足りないですよね。
真っ白な生クリームどっさりのパフェにチョコパウダーで真っ黒にするぐらい足したいですね。
係)誰がそんなこと言ってんだよ!
お前が作ったコードは計算はしてるが、何も入れてないだろ?それに何を入れるんだって話をしてるんだよ。
な)あー・・・え?
係)いいか、今お前が書いたのはこうだ。
01 A PIC 9(3). 01 B PIC 9(3).
これはなんだ?
な)えと…変数?
係)なんで疑問形なんだよ…。意味わかって書いたのか?
な)うー、だって係長が書いたから…。
でも、意味は、AもBも数字が入る3桁の箱で、0-9までの数字が入るんすよね?
係)意味はわかってんだな…。 だが、そのAもBも何が入っているんだってことだ。
な)「僕の考えたポケモン」とか?
夢の中に出てきて、人間もポケモンも休ませず、疲労蓄積でHPを削るポケモン、ナイトメアン!いけ!
係)(イライラ)
な)じゃ、じゃなくて…あれ、000って出たんだから、0すよね?
係)まぁそうだが、本当に0だったのか?
な)へ?
係)0 + 0を計算している可能性が高いってことだ。
な)あ、なんか記憶が…あるっちゃありますが…
変数は作っただけでは「中身不明」
係)まぁいい、おさらいしとくぞ。
参考:【COBOL 読み1-5】WORKING-STORAGEのPIC・VALUE・OCCURSで箱づくりで死角なし
COBOLでは、初期値は保証されていない。 つまり、
A = 不明
B = 不明
ということだ。
な)その「不明」ってのが、意味分かんないす…。
係)そこが引っかかってるのか。
お前は、3桁の数字を入れる箱を作ったわけだが、それは箱を作っただけで、その中身に一切触れていない。
な)作っただけだから、0になるんじゃないんです?
係)そこだ。そこに入っているのはメモリの残骸だ。
な)…
変数の中身は「メモリの残骸」
係)例えば、このメモリを前のプログラムが使ってたととして、Aの場所に
+—+—+—+
| 8 | 3 | 1 |
+—+—+—+
このまま残っている可能性があるってことだ。
な)ふむむぅ
係)だから宣言した直後は
A = ???
B = ???
こちらからみたときは、何が入っているかわからない。だから不明だって話だ。
な)ふみ。
メモリがクリアされてないと、その変数をつかうときに入っていたデータがそのまま引き継がれて使われちゃうって話になるんすか?
係)そういうことになるな。
な)えーそれじゃ、係長が食べ残したから、俺が食べるみたいな感じじゃないすか!回転すしがいいな!酢飯の方でもカモンですよ!
係)何の話だよ!
初期値を入れてから計算する
係)いいか、だから変数を宣言したら、最初に初期値を設定するって話になるわけだ。
な)あーなんかそんなんでしたよね…
係)なら、やれ。
な)あい…
あれ?でも、さっき000て表示されたのはなんでです?
係)それはコンパイラによるってことだ。
今回のコンパイラは気を利かせて初期値が0としてくれるから、000と計算されたってわけだ。
な)ふむぅ。大人の事情ってやつなんすね。大人の情事の事情かもしれないけど。
えと…MOVEだったよね。だから…
MOVE 0 TO A. MOVE 0 TO B.
な)でいいんだっけ? 基本は左から右だから、0をAに入れるってことで、これでいいよね。
これで、いいっすよね?
係)それだと最初と変わらんから、1足す2にしてみろ。
な)むーん、えーと、こんな感じ?
MOVE 1 TO A. MOVE 2 TO B. ADD A TO B.
こうっすよね?
係)ま、いいだろう。形整えて実行してみろ。
な)あい…
IDENTIFICATION DIVISION. PROGRAM-ID. TEST. DATA DIVISION. WORKING-STORAGE SECTION. 01 A PIC 9(3). 01 B PIC 9(3). PROCEDURE DIVISION. MOVE 1 TO A. MOVE 2 TO B. ADD A TO B. DISPLAY B. STOP RUN.
こんな感じかなと。
えとtest.cobを開いて書き換えて…って、なんで一つずつしか消せないんすかこれ?
係)control + Kで1行ずつ消せるぞ。
な)ほえ?(ポチッ) 消えた!!消えまくった! まったく最初からいっといてくださいよー。底意地が悪いんだから…
んで、コピペしてコンパイルして実行っと。(ターン!)
ぎゃああああ!
係)な、なんだよ!?
な)003って表示されましたよ!
003
係)そらするだろ!
おむすび
な)てか、なんなんすこれ?COBOLって普通に動くもんなんす?
係)GnuCOBOLってコンパイラを入れているからな。COBOLを実行できるぞ。
な)ほえーほんとにCOBOLって動くんすね。
係)当たり前だろ。何だと思ってたんだよ。
な)いやー時代が時代なだけに、神話的なお話かと思ってましたよ。
係)どこに神話の要素があるんだよ…
な)でも、こいつできるやつだったんすね!!
係)お前よりよっぽどな。
な)ぐぬ〜
係)それ言いたいだけだろ…
係長のワンポイント
箱を作っただけでは、中身は決まらない。WORKING-STORAGEで作った変数は、初期値が保証されていない。
たまたま0になる環境もあるが、それは仕様ではなくコンパイラの親切だ。
だから実務では、最初に MOVEで初期化する癖をつける。
COBOLは「箱を作る」と「中身を入れる」を必ず分けて考える言語だ。

コメント