1:レコード領域について KEN 04/30 23:38 レコード領域についての質問です。 どなたかご存知でしたら教えてください。 COBOL85の言語説明書に記載されている件ですが、 「ファイルのCLOSEが成功すると関連したレコード領域は参照できなくなる」 とあります。 これはFD句の01レベルで定義したレコード領域の値がCLOSEの実行前と実行後で変わってしまうのでしょうか? WRITEやREWRITEに関しても同じような記載があります。 (WRITEやREWRITEの場合は、SAME RECORD AREAが指定されていれば使用不能にならないとの記載がありますが・・・) 小生の経験では実行前後でレコード領域の値が変わってしまうという現象を確認した事がありません。 実行後のレコード領域を参照して問題になったことがございません。 実行後のレコード領域を参照しないに越したことはないのですが、A-VXのCOBOLでは変わらない仕様なんでしょうか・・・ 変な質問で恐縮ですが、ご存知でしたらご教授のほどお願いいたします。 2:Re:レコード領域について 温泉好きのうさぎ 05/01 14:42 「ファイルのCLOSEが成功すると関連したレコード領域は参照できなくなる」という記述を解釈すると、 01レコード領域の値が実行前と実行後で変わってしまうという意味ではなく、実行前の値がそのまま実行後まで残っていることを保証していないという意味です。 実行後に実行前の値と変わっていなかったのは、A-VXのCOBOLでは変わらない仕様になっているからではなく、たまたま偶然にすぎません。 質問者様のプログラムでは、変える原因となる事象がそのタイミングで起こらなかっただけだろうと想像されます。 プログラムの動作に万全を期すためにも、CLOSE、WRITE、REWRITE命令等実行後にレコード領域を参照しないようなコーディングとすることを、お勧めいたします。 3:Re:レコード領域について KEN 05/01 17:43 温泉好きのうさぎ 様 はじめまして、こんにちは。 早速、詳しいご説明をしていただきありがとうございます。 とても参考になりました。 やはり、「実行前後の内容が同じである保証はない」という解釈ですね。。 試しに実行前後のレコード値の比較を繰り返すバッチPGを作成して一晩中流したり、色々と試してみたのですが、 変わってしまう現象を確認できなかった為、質問させていただいた次第です。。(保証しないとはいえ、その事象にお目にかかったことがないので・・・) と申しますのも、もちろん通常のコーディングでは実行後のレコード領域を参照しないようにしているのですが、 参照しているPGも過去にはあったような記憶がありましたので「変える原因となる事象」や頻度について興味がございました。。 4:Re:レコード領域について 温泉好きのうさぎ 05/01 22:13 こんばんは、KEN様。 A-VXの数あるマニュアルのどこにもそのようなことは書かれておらず、「変える原因となる事象が起こる」というのは、私の想像です。 例えば、実行中のLMに対して、「ロールアウト ロールイン」が発生したとか、オーバーレイ化されたLMのセグメントがメモリから解放されたとかしたときに、タイミングによっては01レコードの内容は保持されていないのかなと思います。 いずれにしても、「ロールアウト ロールイン」や「オーバーレイ」などは、オフコンの初期時代に貧弱なハード環境でプログラムが実行できるよう工夫されたものであり、今のExpress5800/600シリーズなどのメモリに余裕が充分ある状態ではほとんど起こりえないのかもしれません。 5:Re:レコード領域について KEN 05/02 01:00 温泉好きのうさぎ 様 こんばんは。 度々のご回答をありがとうございます。。 なるほど、ちょっと私は勘違いしていたかもしれません。 ファイル記述項の直後に書くレコード記述項(01レコード)を「WORKING-STORAGE SECTION」に書く変数と同じように考えておりました。 READ命令が成功するとレコードの内容がレコード記述項に定義した01レコード(変数)に移送される動作をイメージしておりました。(変数なのでPG側から操作しない限り内容が変わらない) そうではなくて、レコードを処理するために割り付けられた記憶領域(=レコード領域)にPGから直接アクセスする手段として01レコードを使用するイメージでしょうか。。。 この記憶領域はCLOSEによって開放され、CLOSE後に01レコードを参照した場合は開放された記憶領域を見ているに過ぎない為、何の保証もないことに納得です。。 |