• ベストアンサー

COBOLの定義について

COBOLの定義で PIC S9 (07) COMP-3 というデータがあってこれを自分で書かなくてはなりませんが、どんなにやってもデータ例外が出てしまします。自分ではHEX状態で ------- 001 00C ------- みたいなものかと思っていますが、違うようです。 どなたかわかるかたいましたら教えていただけませんか。 よろしくお願しまSう。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.7

>ファイルナンバーは文字列なので 文字としたいなら、「PIC X(n)」で宣言する必要があります。 「PIC 9(n)」は、外部10進であり、そのまま演算にも使えれば表示もできる型です。 PIC 9(5)であれば、内部形式は次のようになります。 X'FdFdFdFdsd' 1バイトを縦で表す方が分かりやすければ、 FFFFs ddddd です。 dはX'0'~'9'の値、sは符号で、正=X'C'、負=X'D'、符号なし=X'F'。 dの部分に、'0'~'9'以外の値を入れて参照すると、データ例外になります。

tax1301
質問者

お礼

ご回答ありがとうございます

その他の回答 (6)

  • ssykpu
  • ベストアンサー率28% (319/1125)
回答No.6

行き違いになったようで、失礼しました。 通番        PIC S9 (07) COMP-3 区分        PIC 9 (01) ファイルナンバー  PIC 9 (05) 通番の中身はX’0000001C’であってますが ファイルナンバーの中身が数字ではありませんよね。 区分はX’F0’でOK。 しかしファイルナンバーで’FPFNF0F0F1’でPとNはなんでしょうか?ファイルナンバーを参照した時点でデータ例外じゃないでしょうか?

tax1301
質問者

補足

ファイルナンバーは文字列なのでデータ例外にはならないと思っていましたがそこに問題があったのでしょうか? でも親切にありがとうございました。

  • ssykpu
  • ベストアンサー率28% (319/1125)
回答No.5

>PIC S9 (07) COMP-3というデータがあってこれを自分で書かなくてはなりません ここがよく分からないのですが、例えば 01 REC-A.    03 ITEMS.      05 ITEM1 PIC S9(07) COMP-3.      05 ITEM2 PIC  X(10).    03 FILLER  PIC  X(66)・ の場合、REC-AまたはITEMSをSPACEクリアしただけでは問題のITEM1がZEROと認識されませんのでITEM1を参照した時点でデータ例外となりますよね。 また例えばテーブル操作で、 01 TABLE-A.   03 TBL OCCURS100.      05 ITEM1 PIC S9(07) COMP-3.      05 ITEM2 PIC  X(10). このテーブルをクリアするのにTABLE-AをSPACEクリアしただけでは、ITEM1を参照した時点でデータ例外となりますよね。 質問はここまで具体的に書かないと答えようがありません。     

tax1301
質問者

お礼

ご指摘ありがとうございます。

回答No.4

>これを自分で書かなくてはなりません どういう意味でしょうか? 宣言部であれば、 01 TBL. 03 ITEM1 PIC S9(7) COMP-3 VALUE 100. 03 ITEM2 PIC S9(5). 処理部であれば、 MOVE 100 TO ITEM1. といった形で10進数として使えばいいだけですが? 初期化せずに使ってゴミが入っていたり、構造体でMOVEしたりすれば、文字として扱われてしまうので、その場合は内部10進ではない値が入り、データ例外になる場合があります。 しかし、10進数の定数を入れたり、数値のデータ型(内部10進、外部10進、2進数)間のMOVEなら自動的に型変換されるので、データ例外には通常はなりません。

tax1301
質問者

お礼

ご回答ありがとうございます。

回答No.3

OSは何で、何というCOBOLを使っているのでしょうか? IBM互換(IBM、日立、富士通)のメインフレームであれば、PIC S9(7) COMP-3の内部構造は、16進表記をすると次のようになります。 dd dd dd ds 長さは4バイトであり、dの部分にはX'0'~X'9'の値が入り、sは符号としてX'C'やX'D'あるいはX'F'が入ります。X'C'が正、X'D'が負、X'F'は符号なしです。 dの部分にX'A'~X'F'といった値を入れてしまったりすれば、データ例外になります。 すなわち、 +1なら、X'0000001C' -1なら、X'0000001D' +123なら、X'0000123C' といった感じです。

tax1301
質問者

お礼

ご回答ありがとうございます。

  • ssykpu
  • ベストアンサー率28% (319/1125)
回答No.2

失礼しました。PIC S9 (07) COMP-3は4バイトでしたね。

tax1301
質問者

補足

回答ありがとうございます。 レコードを自分で作って最小限のレコードでプログラムが動くかどうかというのをしているのですが、最初に読みこむとき手作りで 通番        PIC S9 (07) COMP-3 区分        PIC 9 (01) ファイルナンバー PIC 9 (05) の定義で ---------- 0001FFFFFF 000C1PN001 ---------- のレコードをつくるとデータ例外でエラーになってしまうんです。

  • ssykpu
  • ベストアンサー率28% (319/1125)
回答No.1

どんなときデータ例外になるのですか?レコードを読み込む時?MOVEの時?演算の時? また PIC S9 (07) COMP-3 は5バイトですよね。データ例外の時の中身がどうなってるのかをHEXダンプしてみないと分からないのですが。000000001Cにはなってないのですか? もうちょっと詳しい情報があれば、回答できるのですが。

関連するQ&A

  • COBOLとCの変数定義

    いつもお世話になってます。 今回は、COBOLとC言語の変数定義の事で質問させていただきます。 以下のCOBOLの変数定義をC言語で記述するとどのようになるでしょうか? 01 wkarea. 05 wk-code. pic s9(03) comp. 05 wk-err-code. 10 filler. pic x(01) value '0'. 10 wk-err-code-9 pic 9(05) 412. 05 wk-err-mdl. 10 filler pic x(01) value '0'. 10 wk-err-mdl-9 pic 9(40) value space. 05 wk-e-code 10 filler pic x(01) value 'A'. 10 filler pic x(01) value 'B'. 10 wl-id pic x(02). 10 wk-no pic 9(03) value xero 10 wk-level pic x(01) value low-value. ちょっと手間かも分かりませんが、どなたか詳しい方いらっしゃいましたら、お答え頂けると有難いです。 よろしくお願いします。 .

  • COBOLを最近はじめたのですが

    COBOLを最近はじめたのですが データの定義のところで A PIC 9(10)S. B PIC S9(10). とあったのですがSの意味がわかりません。 左にあったり右にあったりします。 どちらも同じ意味なのでしょうか

  • COBOLでの可変長定義について

    unix環境下でCOBOL85を使用しています。 あるデータを可変長でWRITEしていくのですが、 データにヘッダー情報みたいなものが付加されてしまい困っています。 ヘッダー情報を付加しないようにするにはどうすればいいのでしょうか? 定義:  FD Aファイル RECORD IS VARYING 1 TO 100 DEPENDING ON A-CNT.  01 A-DATA PIC X(100). とか  FD Aファイル RECORD IS VARYING IN SIZE DEPENDING ON A-CNT.  01 A-DATA PIC X(100). というパターンで試しています。 Aファイルにaaaという3バイトデータをWRITEすると、 COBOL85020315020304・・・・・aaaというデータが出力されます。 あるコボラーに聞くと「定義がおかしいからでしょう」と言ってたのですが、 どうおかしいかは本人もわからないようです。 どうすればヘッダー情報(COBOL85020315020304・・・・・)がつかず、 可変長でWRITEできるのでしょうか?教えて下さい。

  • COBOL97,Power-COBOLでの効率の良い書き方

    汎用機のCOBOLでは添字にはCOMP-1を使うと効率が良いとか、ベースレジスタ削減のために 01レベルのワーク領域の数を減らす(少数の01レベルの配下にワーク領域を定義する)などがマニュアルに記載されていました。 ところがパソコン/サーバ上で動くCOBOLの場合は、計算用にCOMP-3を使うと処理効率が悪い、計算用ではCOMP-3よりはDISPLAY項目、さらに良いのはCOMP-5である、などと言う記事もあり汎用機COBOLとはずいぶん違うようです。実際のところ、パソコン/サーバ上で動くCOBOLで実行時の効率が良いプログラムを書くためには、どのような事に注意すれば良いのでしょうか?

  • COBOLのCOMP形式について

    久しぶりにCOBOL開発をする事になり、 懐かしく思ってPGを解析しているとどうしても 思い出せないものがありました。  COMP形式です。 AAA PIC 9(05)      5バイトで12345ならば「F1F2F3F4F5」 BBB PIC 9(05)COMP-3      3バイトで12345ならば「12345F」 CCC PIC 9(05)COMP      この場合は何バイトになるのでしょうか?      及び、12345の場合、どのようになるのでしょうか? 以上、初歩的な部分ですが皆様よりご教授頂きたいと思います。 よろしくお願いします。

  • COBOL数値転記の仕様

    このたび、まったくの未経験の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の(お堅い規格を書き写しただけでない)解説のサイトなどあれば、ご紹介いただけますでしょうか。

  • 富士通COBOLの画面定義について

    何年か前にはNECでプログラムを組んでいたのですが、最近は富士通のCOBOLでプログラムを組んでいます。富士通のCOBOLで画面の定義がよく わかりません。例えば下記の記述で FD DSP-F. 01 GM-REC. 03 GRP001. 05 GM-SYORI-K-COM PIC X(03). 05 GM-SYORI-K PIC 9(01). 上記のGM-SYORI-K-COM PIC X(03)の3バイトは何を定義しているのですか?それとこの3バイトを使ってどんな事ができるのですか? 富士通のマニュアルを見ても説明しているところがなくて困っています。 基本的な質問で申し訳ありませんが、よろしくお願いします

  • COBOLについて

    COBOL初心者なのですが。 COBOLで 01 A.   03 B PIC 9(02).   03 C PIC X(02). MOVE  SPACE  TO  A. とした時、基本項目であるBには何が入っているのでしょうか? 数字項目にSPACEというのはありえないですよね。 どなたかわかる方、教えていただけませんか?

  • pro*cobol ⇔ oracle のデータ型の扱い

    お世話になります。 pro*cobolで、テーブルの作業領域を定義し、 データの編集後、oracleのテーブルへ出力している のですが、cobol側の定義はpic9タイプで oracleの項目定義ではCHAR型になっております。 この状態で、cobol側のpic9タイプの項目に "A00001"等文字を含む値を設定した所、 ABENDせずにoracleテーブルに"A00001"の 項目値を出力しています。 cobolだけに限れば、属性エラーなのですが、 この場合、oracleの項目定義が優先されるのでしょうか? よろしくご教授の程、お願い申し上げます。

  • PRO*COBOLのSQLCTXの桁数変更

    COBOLの組み込みSQLについて質問があります。 Oracle 8.1.5 のPRO*COBOL でプリコンパイルしたところ、 "SQLCTX" が書き加えられています。 符号付の9桁の数字項目であるはずなのに、 10けたの数字が初期値として与えられてしまいます。 01 SQLCTX GLOBAL PIC S9(9) COMP-5 VALUE +1000107995. ↑ コンパイルすると、ここでエラーになってしまいます。   解決法知っている方、どうか教えてください。   先週は正常の値(9桁)が入っていました。 ----------------------------------------------------------------------

専門家に質問してみよう