あなたの習慣について教えてください!!

このたび、まったくの未経験のCOBOLをやることになりました。
で、数値データの表し方になんやかやとやたら方法があるようなのですが、それらを互いに「転記」したときに、どういう結果になるものか、皆目わからないんです(環境はCOBOL85でWindows上での開発です)。
テクニックとしては基本だと思うのですが、それでいてどこにも説明されていな~い!フリーのCOBOLツールは見つけてきましたが、使い方が???なもので…。
 たとえば、

 01 X1 PIC XX (数値が入ってるとします)
 01 N1 PIC 99
 01 D1 PIC 99 COMP
 01 B1 PIC 1(16) BIT

な場合、X1とN1は直接
 MOVE N1 TO X1
などとやってもデータは失われないと思うんですが、他の形式での操作は(桁あふれとか無視して)ちゃんと転記できるのでしょうか。

いま特に、D1からX1へというパターンが多いです。1バイトの2進データを、数値の文字列として使おう、というんです。いわば、1バイトを3バイトに展開してやるんです。何も考えずに書けば、
 01 D2 PIC 9(4) COMP VALUE 97
 01 X2 PIC X(3)
 MOVE D2 TO X2
でしょうけど、たぶん'a△△'になるだけのような気がします…。
 それとも、
 01 N2 PIC 9(4)
 MOVE D2 TO N2
 MOVE N2 TO X2
などとやっていけたりするのでしょうか。

いったいどうなるのでしょう、いろいろ書いちゃいましたけど、各々の転記の仕組みを教えてください。

また、COBOLの(お堅い規格を書き写しただけでない)解説のサイトなどあれば、ご紹介いただけますでしょうか。

A 回答 (3件)

ShiozawanoYukiさんはCOBOL未経験とのことですが


ご質問のような数値と文字との間の転記はCOBOL上規約はありますが実際には例外的にしか行われないでしょう。

COBOLコードの厳しい社内ルールを定めてる会社では数値と文字との間の転記は禁止されています。
(桁あふれ、計算時に不能や範囲外の値になったり、ひどいとエラー終了になるか引き起こしたりするからです。)
転記する場合は同じ桁数同士のみで行う社内ルールを決めているところもあります。
(桁あるれ対策です。)

*数値と文字との間の転記はデータの定義で対処します。

COBOLのデータは構造体になっています。
(ご質問のようなデータ構造はフラグ、繰り返しや一時的な変数などには使用しますが普通はレベルを使用したデータ構造で定義します。)

>MOVE N1 TO X1
のコードのデータは

 01 X.
  02 X1 PIC 99.
 01 N1 PIC 99.

などと定義し転記後に文字で使用する場合は”X”(2桁)を使用します。
しかし、ただ”N1”を文字として使用するだけである場合は

 01 NX.
  02 N1 PIC 99.

と定義し、”NX”(2桁)を文字として使用する方法もあります。
(これは9タイプとXタイプの内容が同じため利用できますがバイナリなどでは転記してから利用します。)


逆に数値から文字に転記する場合は

 01 D2 PIC 9(4) COMP VALUE 97.
 01 X2.
  02 X9 PIC 9(4).
 01 XR REDEFINES X2.
  02 XR1 PIC X(02).
  02 XR2 PIC X(02).

   MOVE D2 TO X9.

となり文字として使用する場合は”X2”(4桁)を使用します。
”X2”は数字から転記されたので”0097”が入っています。

”X2”を”△△97”にする場合は”X9”を”ZZZ9”または”ZZZZ”(”Z(04)”)の編集項目で定義すれば実現できます。
(”0”(”0000”)を転記した場合に”ZZZ9”は”△△△0”、”ZZZZ”は”△△△△”になります。)

4桁を上2桁と下2桁で使用する場合は上記のように”X2”を再定義(REDEFINES)し”XR1”、”XR2”を使用します。
(個人的には最上位レベルでの再定義は避けるようにしています。)

*実は転記を悩まずに行うには、実は上の厳しい社内ルールと記した”同じ項目種類、桁数でのみ転記”を行い、項目種類の変換はデータ定義で行うのがポイントです。


*COBOLを理解するためにはデータ構造を理解することが良いと思います。
 (命令は他の言語より少なく対応が容易です。ただ、少ない分、自分でコード作成が必要です。ここが他の言語しか知らないプログラマには大変かもしれません。)

後、ピリオドを付けないとのルールがないなら、命令の最後にはピリオドを付けましょう。
(IF文の中では逆に付けません。そのため逆にピリオドがトラブルの原因ともなり、モジュールの最後だけに付けるとの社内ルールを決めているところもあります。)

>また、COBOLの(お堅い規格を書き写しただけでない)解説のサイトなどあれば、ご紹介いただけますでしょうか。

残念ですがCOBOLは他の言語と違い歴史がある割りには定番類があまりありません。

最新のCOBOLは他の言語のように色々な命令が追加されているようですが、本来は当時のプログラミングの専門家以外でもプログラムを作成することを目標に設計されています。
(当時といっても、もう半世紀も前の話ですが・・・)
そのため、元は限られた命令と定義されたデータ構造だけでプログラムが作成できます。
(バッチであればファイル処理と帳票処理を中心に憶えれば良いと思います。問題はオンラインとWebの場合ですが真似からなれるしかないかもしれません。)


参考になるでしょうか?
    • good
    • 3

文字タイプを数字タイプにMOVEするのは良くないことですね


01 A PIC XX.
01 B PIC 99.

MOVE A TO B

COMPUTE B = A 
と同じです・・・・

01 A.
   02 A-R PIC 99.
として
IF A NUMERIC
   MOVE A-R TO B
ELSE
   MOVE 0 TO B.(数値以外であればとりあえず0にする)

01 C PIC 9(4) COMP VALUE 97.
これは 一度
数値項目の
01 D PIC 9(4).
01 D-R REDEFINES D PIC XXXX.

MOVE C TO D.

元データにサインがある時はPICのところでS9(4)にして、MOVEで受取ると駄目ですね。
この場合は、
01 E PIC S9(9).
01 F PIC -------.や ZZZZZZ-.の編集タイプにすれば
MOVE C TO E.
MOVE E TO F.の2回MOVEですね.

BITタイプもこれの応用です

でも、昔と違い、COMPやCOMP-3などはあまり使わなくても良いのでは・・・・メモリも大きくなったし、レコード長の制限も緩和されているから・・・・
    • good
    • 1

COBOLはしばらく使っていませんが、どなたからも回答がありませんので


記憶を頼りですがお答えします。

先ず、COMP指定がある等は難しく考えないで良いです。
内部で演算の際に、その処理系の演算に適したデータ形式が取られる・・・
位に考えてください(ちょっと乱暴ではありますが)
詳しく知りたかったらマニュアルに書かれています。

するとずっとシンプルに見えてきます。
  MOVE N1 TO X1
等、D1からX1へというパターン・・・
数値項目を文字項目に転記・・・は出力の為の編集では頻繁に使います。
桁数にだけは気をつけてください。

  MOVE D2 TO X2
想像された”a△△"の意味は解りませんが、結果は”097”でしょう。

  MOVE D2 TO N2
  MOVE N2 TO X2
は問題ありませんが、後者は桁落ちする場合があります。
上記のすべての例は、符号は考慮されていない(すべて+)事にも注意してください。

・蛇足ですが、数値項目は文字項目に転記できるが、その後演算には使用できない。
・文字項目から数値項目への転記はできない。
(データが確実に数字なら実行時エラーにはならないが・・・)

お役立ちサイト を検索してみましたが、

http://www.koganet.ne.jp/~kitagawa/shome/index.h …
http://www.t3.rim.or.jp/~buchi/proco.html

処理系は違っても、文法規格は国際統一されていますので役に立つのではないでしょうか!
    • good
    • 0
この回答へのお礼

ありがとうございますっ!ちょっと感動入っています。
むかしCを触っていたのでその中でビット仕様を意識する習慣がついてしまったということになりましょうか。
ですと、PICの型(?)を問わず、数値であれば中身のビットを気にせずに転記できるということになるわけでしょうか。であれば、型によるちがいはコンパイラがうまくやってくれるということでしょうか。
97が'a'と解釈できるのは、文字'a'のコードが(たしか)97であるところからきてます。

ちなみにビットで定義した
 01 B1 PIC 1(16) BIT
は、転記に際しては文字通りビットを写すだけになりましょうか。たとえば
 MOVE '0000000001100001' TO B1  (←97:10進)
に対して
 MOVE B1 TO X1
 MOVE B1 TO D1
とかやると、それぞれ'a'と97(あれ符号がない?…)になったりするわけでしょうか。

なんかやっぱり難しいですね。=_=

お礼日時:2007/02/17 13:26

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報