このたび、まったくの未経験の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の(お堅い規格を書き写しただけでない)解説のサイトなどあれば、ご紹介いただけますでしょうか。
No.2ベストアンサー
- 回答日時:
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の場合ですが真似からなれるしかないかもしれません。)
参考になるでしょうか?
No.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などはあまり使わなくても良いのでは・・・・メモリも大きくなったし、レコード長の制限も緩和されているから・・・・
No.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
処理系は違っても、文法規格は国際統一されていますので役に立つのではないでしょうか!
ありがとうございますっ!ちょっと感動入っています。
むかし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(あれ符号がない?…)になったりするわけでしょうか。
なんかやっぱり難しいですね。=_=
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
10代と話して驚いたこと
先日10代の知り合いと話した際、フロッピーディスクの実物を見たことがない、と言われて驚きました。今後もこういうことが増えてくるのかと思うと不思議な気持ちです。
-
これ何て呼びますか
あなたのお住いの地域で、これ、何て呼びますか?
-
メモのコツを教えてください!
メモを取るのが苦手です。 急いでメモすると内容がごちゃごちゃになってしまったり、ひどいときには全く読めない時もあります。
-
あなたは何にトキメキますか?
「きゅんとした〜♪」 と思う瞬間ってありますよね。 それは恋愛だったり、推し活だったり、映画のワンシーンだったり……。
-
高校三年生の合唱祭で何を歌いましたか?
大人になると大人数で合唱する機会ってないですよね。 思い出すと、高校三年生の合唱祭が最後でした。 そこで、みんなの思い出の合唱曲を知りたい!
-
COBOLのMOVEで桁数が異なる場合
その他(プログラミング・Web制作)
-
COBOLで文字タイプを数字タイプに変換する方法
その他(プログラミング・Web制作)
-
COBOLのS9タイプからXタイプへ変換する過程
その他(プログラミング・Web制作)
-
-
4
S9タイプからXタイプにデータは移行できるのか。(COBOL)
その他(プログラミング・Web制作)
-
5
COBOLについて
その他(プログラミング・Web制作)
-
6
【COBOL】文字列から数値項目に転記するにあたって
その他(プログラミング・Web制作)
-
7
COBOLのCOMP形式について
その他(プログラミング・Web制作)
-
8
COBOL 9(02)で定義した変数にマイナス値をセットすると?
その他(プログラミング・Web制作)
-
9
COBOLの桁落ち
その他(プログラミング・Web制作)
-
10
COBOLでのNOT = の AND条件
その他(プログラミング・Web制作)
-
11
COBOLの数字チェック
その他(プログラミング・Web制作)
-
12
COBOLの改行
その他(プログラミング・Web制作)
-
13
EBCDIC⇒SJIS変換の方法
その他(プログラミング・Web制作)
-
14
【COBOL】read文でエラー
その他(プログラミング・Web制作)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/12】 急に朝起こしてきた母親に言われた一言とは?
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・好きな「お肉」は?
- ・あなたは何にトキメキますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
XMLでデータとして画像を指定す...
-
【C#】textBoxの指定行のデータ...
-
C# DataTableに最後に追加した...
-
VBAコンボボックスの内容が反映...
-
「Nullの使い方が不正です」の...
-
ExcelVBAで戻り値を返すには
-
COBOL数値転記の仕様
-
エクセルのCSV読み込みについて
-
Excel VBAでフォルダ内の全テキ...
-
【ExcelVBA】値を変更しながら...
-
Excel VBA で日付を4ケタの数値...
-
MSFlexGrid 行選択状態
-
配列処理
-
Microsoft Query を勉強したいが…
-
batでレジストリキーから読み取...
-
VBAでアクセスDBからデータの取...
-
INT64対応のprintf系関数はあり...
-
VBA 変数名に変数を使用したい。
-
Excel2010のinputboxで複数デー...
-
WORD型をCString型に変換する方法
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
XMLでデータとして画像を指定す...
-
【C#】textBoxの指定行のデータ...
-
VBAでアクセスDBからデータの取...
-
VBAコンボボックスの内容が反映...
-
C# DataTableに最後に追加した...
-
COBOL数値転記の仕様
-
「Nullの使い方が不正です」の...
-
ListViewで表示されたデータの...
-
アクセスでウェブ上のデータを...
-
クリスタルレポートでレコード...
-
非同期のプロセス間通信(パイプ...
-
【ExcelVBA】値を変更しながら...
-
MSFlexGrid 行選択状態
-
【VB.NET】Excelの最終行までの...
-
Excel VBA で日付を4ケタの数値...
-
エクセルVBA WEBからデータ取...
-
エクセルのCSV読み込みについて
-
エクセルのセル最終行取得
-
Excel VBAでグループ毎に集計す...
-
【エクセルVBA】DBのデータをCSVに
おすすめ情報