• ベストアンサー

COBOLから呼ばれる時

COBOLプログラムから呼び出され、ファイルのレコードを一行読んでレコードの内容を返すというcサブルーチンを作っているのですが、COBOL←→c間でのインタフェースの扱いかたがよくわからなくて困っています。(ちなみにこのモジュールはcからも呼ばれる事がある) COBOLはコピー句(test001.cbl, test002.cbl)に値を入れて、cサブルーチンにそれを渡しています。 テストはCOBOL85を使用してるので、cサブルーチンの中のデータを見ることができません。なので、返ってくるコピー句の中身を見るのですが、とにかく値が設定されてかえってこないのです。ただ単にロジックのバグと言う可能性もあるけど(^^; 私はインタフェース環境の事がまだ良く解っていないので、今回こちらに質問した次第です。経験者の方がいましたら、どうかおしえてください。 あ、それからCOBOLから渡される値は、c側では全てchar型で受け取らなければいけないような話しを聞いたのですが、本当でしょうか? もう一つ。 コピー句の中で「F-CODE PIC X(2)」のようにハイフンがあるのですが、cではハイフンが使えないからダメなんでしょうか? たくさん質問してしまいましたが、どうかよろしく。 /COBOL側/ -------------------------------------------------- CALL 'TEST1' USING BY VALUE TEST001 TEST002. -------------------------------------------------- /cサブルーチン側/ -------------------------------------------------- int TEST1(test001, test002) char *test001; char *test002; {     ・     ・     ・ return (0); } --------------------------------------------------

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

  • ベストアンサー
  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.2

「マニュアルを読め」と言う No.1 の回答が本質だとは思いますが、想像できる範囲で。 > 返ってくるコピー句の中身を見るのですが、とにかく値が設定されてかえってこない 引数で指定した変数の内容を、C の関数で設定して、それを COBOL 側で参照したい、 ということですよね。であれば、 > CALL 'TEST1' USING BY VALUE TEST001 TEST002. CALL 'TEST1' USING BY REFERENCE TEST001 TEST002. ということだと思いますよ。詳細は、マニュアルの CALL 文のところを読むと わかる(かもしれない)でしょう。 > COBOLから渡される値は、c側では全てchar型で受け取らなければいけない その言い方は正確ではないですが、だいたいの場合に当てはまるはずです。 C には、変数に対する桁数の指定、という概念がありません。 USAGE 句で BINARY とか指定した変数は、C 側では short で受取れるはずです。 > コピー句の中で「F-CODE PIC X(2)」のようにハイフンがあるのですが、cではハイフンが使えないからダメなんでしょうか? 仮引数と実引数の変数名は一致している必要はありません。呼び側と受け側で一致 している必要があるのは、その型と順序です。 # 実は、COBOL をやった事がありません (^^; # 仕事で COBOL のソースを読むはめになりそうなので、自分の勉強に利用させて # もらいます。「専門家」のチェックは「計算機屋」だ、という意味でチェックしました。

techtak
質問者

お礼

ありがとうございます。 とても参考になりました。 計算機屋も大変でね。(^^; 作る人にもよりますが、他人の書いたソースはわかりずらいですよね。(笑 がんばってください。

その他の回答 (1)

  • ranx
  • ベストアンサー率24% (357/1463)
回答No.1

言語間インタフェースは規格化されていないケースがほとんどだと思いますし、 仮に規格化されていても、お使いの言語処理系がそれに準拠しているとも 限りませんから、まずはお使いの言語処理システムのマニュアルを参照された 方がよいと思います。その上で、なお分からないということでしたら、お使いの 環境(OS・言語処理ソフト等)を示した上で質問されれば、あるいは知っている 人がいるかもしれません。

techtak
質問者

お礼

聞く前にまず自分で調べるのは当然ですよね。(^^; 今回は、切羽詰っていたので皆さんに頼ってしまいました。 でも、こちらのサイトは本当に頼りになります。 アドバイスありがとうございます。

関連するQ&A

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

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

  • COBOLについて

    COBOLで以下のような仕様の場合、どのようなロジックにするのが良いでしょうか? ・仕様  A項目=値A または  B項目=値B または  (C項目=値C かつ D項目=値D ) または  E項目=値E 上記の場合、何も処理しない(以降の処理もせずに、次レコードを読みに行く  上記以外の場合、処理1を行い、次処理以降の処理を継続する。 (ロジック1) IF A項目=値A OR B項目=値B OR (C項目=値C かつ D項目=値D ) OR E項目=値E THEN CONTINUE ELSE 処理1を行う END-IF. (ロジック2) IF A項目=値A MOVE '1' TO 該当フラグ END-IF. IF B項目=値B MOVE '1' TO 該当フラグ END-IF. IF (C項目=値C かつ D項目=値D ) MOVE '1' TO 該当フラグ END-IF. IF E項目=値E MOVE '1' TO 該当フラグ END-IF. IF 該当フラグ='1' CONTINUE ELSE 処理1 END-IF. 自分は仕様に沿ってロジック1で組むべきだと思うのですが、 ロジック1は分かりずらいのとメンテが大変なのでロジック2で組むべきだと言われました。 どちらで組むのが普通でしょうか?どなたか教えて下さい!

  • COBOL

    COBOLから.NETへ移す作業をしております。 以下の点で詰まりました。 1、pic X(03) COLUMN 7. このうち、COLUMNは何をしているのでしょうか? 調べてもわかりませんでした。 2、 MOVE ZEROとイニシャライズの違いについて MOVE R-TBL TO ZEROとINITIALIZE R-TBL 実際に何が違うのでしょうか? R-TBL内にname pic X(08)という変数と number pic 9(2)という変数があったとすると ZEROの方は name⇒"00000000" で number⇒0 INITHLIZEの方は name⇒""  で number ⇒ 0 でしょうか? 3、HIGH-VALUEについて HIGH-VALUEが取りうる最大値を表すことはわかりました。 VBでもC#でもchar.MAXVALUEみたいに取れます。 name pic X(10)にHIGH-VALUEを入れるとすると.NETで実現しようとすると string name = char.MAXVALUEとなります。 これを 01 R-TBL. 02 box PIC 9(5). 02 id PIC 9(5). に代入したいのですがうまく出来ません。 どうすればよいのでしょうか?

  • COBOLでのチェックデジット算出

    COBOL初心者です。 01 印刷領域. 03 Aコード PIC X(03). 03 Bコード PIC X(04). 03 Cコード PIC X(02). 03 チェックデジット PIC X(01). と定義した変数のA,B,Cコードだけをサブルーチンに渡して、チェックデジットを受け取りたいと思います。 このときチェックデジットを抜いた"印刷領域"を渡すことは可能でしょうか? 例) Aコード 102 Bコード 2001 Cコード 03 渡すデータ102200103 受け取るチェックデジット7 印刷領域 1022001037 という具合にしたいんですが… あと、A,B,Cコードは数字に変換しなければなりません。 すみませんがおしえてください(ToT)/~~~

  • PRO COBOLでFETCH時に値を変換する

    PRO COBOLでoracleデータを読み込むプログラムを変更しようとしています。 元のプログラムは、 ----------------------------- WORKING-STORAGE SECTION. EXEC SQL DECLARE table10c CURSOR FOR SELECT table10.item11, table10.item12 FROM table10,table20 WHERE table10.item13 = table20.item23 END-EXEC --- PROCEDURE DIVISION. EXEC SQL FETCH table10c INTO file-item11, ←出力ファイルの項目1 file-item12 ←出力ファイルの項目2 END-EXEC. ----------------------------- となっていて、item13 と等しい値が table20.item23 にある場合 item11 と item12 の値を順次、ファイルに出力しています。 今回、仕様を変更し、item11の値を変換してファイルに 出力しようとしています。 変換する値は、テーブル:henkan に登録しています。 項目1:old-item ・・・table10.item11にセットしている値 項目2:new-item ・・・file-item11にセットしたい値 WHERE句の条件は、そのままです。 (WHERE table10.item13 = table20.item23) 但し、item11の値は全て変換するわけではなく、 テーブル:henkan に一致するレコードが有る場合のみ つまり table10.item11 = henkan.old-item の場合のみ file-item11 に henkan.new-item の値を出力し、 それ以外の場合には、table10.item11 の値をセットします。 この変更を極力少ないロジックの改修で済ませたく 基本的には 「DECLARE table10c CURSOR」句の変更と したいです。 「SELECT table10.item11,」の項目を変数にして 変換した場合は、henkan.new-item の値をセットし 変換しない場合には、table10.item11 の値をセットできれば 良いのではないかと思っていますが具体的な方法が判りません。 同様の変更を(出力条件等の異なる)複数のプログラムに 行うつもりで「PROCEDURE DIVISION」は、複雑になっているため 変更は最小限としたいです。 PRO COBOLの経験が少なく、アドバイスをお願いします。

  • COBOLのデータ型

    こんばんわ。 現在研修をしており、COBOLの勉強をしております。 COBOLを他言語に置き換える作業を後に担当することになるようです。何の言語かは聞いておりません。勉強している中いくつかわからない点がでました。ご教授いただければと思います。 S9(6)というデータ型は符号ありの整数ということは調べました。 ファイルレコード内に上記のデータ型が存在し、出力ファイルを調べると「00000A」 という値が出力されていました。 ここでふと思ったのがAって何だ?と思いました。そもそも10進数なのか?という疑問が出て 調べるとゾーン10進数という特殊な数値のようです。 ゾーン10進数を調べても全然意味がわかりません。ゾーン部を○○とする!とかゾーン10進数の説明している記載がありますがCOBOLにはそんな記述ないし・・・ とまぁ私が知りたいのはS9(6)というデータ型をどう他言語(C言語)でどう実現しようかという内容がしりたいです。また「00000A」は実際の10進数ではどういう数値かというのも知りたいです。 以上、お手数ですがどうかよろしくお願い致します。

  • COBOLで、文字タイプのフィールドを文字コードで指定したい。

    Cで書くと以下のようになるものをCOBOLで実装したいと思っています。 --------------------- int i; char c[4]; c[3] = '\0'; for (i=0;i<3;i++) { c[i] = '0'+i; } /* 結果、c = "012"となる。 --------------------- つまり、文字コ-ドを数値タイプのフィールドで計算して、その結果を文字タイプのフィールドに代入したいのです。 COMPUTE句で書いてみると数値タイプを文字タイプに代入できないと怒られてしまい、困ってしまいました。 COBOLで文字タイプのフィールドのデータを文字コードで指定(数値タイプでの演算結果で指定)するにはどうしたらいいのでしょうか?

  • cobolのコントロールブレイク

    趣味の一環としてcobolのファイル入出力プログラムを勉強しているのですが、 リング構造を利用したコントロールブレイク機能の実装で躓いてしまいました。 知恵をお貸しいただければ幸いです。 ソースコードここから IDENTIFICATION DIVISION. PROGRAM-ID. BREAKDV1. ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT INF ASSIGN TO "C:\cobol\sample.cbl" STATUS FST. SELECT OUF ASSIGN TO "C:\cobol\data.txt". DATA DIVISION. FILE SECTION. FD INF. 01 F1R PIC X(72). WORKING-STORAGE SECTION. 01 INKEY PIC 9(01). 01 SAVKEY PIC 9(01). 01 FST PIC X(02). PROCEDURE DIVISION. ACCEPT INF OPEN INPUT INF OUTPUT OUF PERFORM 読込処理 THRU 読込出口 PERFORM UNTIL INKEY = HIGH-VALUE MOVE SAVKEY TO INKEY PERFORM UNTIL INKEY NOT = SAVKEY PERFORM 同一処理 THRU 同一出口 PERFORM 読込処理 THRU 読込出口 END-PERFORM PERFORM 合計処理 THRU 合計出口 END-PERFORM PERFORM 総計処理 THRU 総計出口 CLOSE INF OUF STOP RUN. 同一処理. DISPLAY "SAME" WRITE F1R DISPLAY F1R 同一出口. EXIT. 合計処理. DISPLAY "TOTAL" 合計出口. EXIT. 総計処理. DISPLAY "END" 総計出口. EXIT. 読込処理. PERFORM UNTIL FST NOT "00" READ INF END MOVE HIGH-VALUE TO INKEY NOT END CONTINUE END-READ END-PERFORM 読込出口. EXIT. ソースコードここまで(処理内容は仮のものです) 参考文献ではこのような組み方でよいはずなのですが、コンパイルした際に BREAKDV1.cbl:19: Error: syntax error, unexpected "end of file" とエラーが発生してしまいました。 このエラーを解消する方法をお教え下さい。 開発環境: Windows7SP1+MinGW32、サクラエディタ

  • COBOL集団項目の領域の長さが分かる命令や手法はありませんか?

    COBOL集団項目の領域の長さが分かる命令や手法はありませんか? 汎用機の開発に従事している者です。 COPY句を使ってファイルレイアウトを展開するやりかたで、 そのレイアウトが設計書どおりかを確認したいのです。 例えば、 01 OT-FILE.  03 OT-AAA    PIC 9(007) COMP-3.  03 OT-BBB.    05 OT-BBB-A PIC ZZZ9.    05 OT-BBB-C PIC 9V99. だと、OT-FILEは11バイト、OT-BBBは7バイトというようにです。 エクセルに展開して関数やマクロを駆使して数えるのも いいのですが、コンパイル‐リンクを行って実行形式に変える 事が一番の検証方法かと思います。 その際に領域の長さを求める手法があれば、自前で作る エクセル関数よりも信頼度の高いチェックが少ない工数で可能ですが なかなか良い考えが浮かびません。 どなたかお教え願います。

  • 汎用機のCOBOLのソース上でUNICODEのカンマを設定したい

    汎用機のCOBOLを使用しています。今回、ソース上でUNICODEのカンマを設定する必要がでてきたのですが、どのように設定していいかわかりません。。。 処理をしたデータをバイナリで(文字コードを変換しないで)転送する必要があり、かつデータの受け取り側がカンマをUNICODEでと指定してきているため、(COBOL上でカンマを打っても、汎用機の英数字コード(EBCDIK)になってしまいますので)どうしてもCOBOL上でUNICODEのカンマをしなければなりません。 UNICODEでのカンマはコードが「U+002C」ということなのですが、どのように設定すればUNICODEでカンマと認識されるのでしょうか? とりあえず、下記のような項目をつくってデータをつくってみたのですが・・・ 01 X-COMMA PIC X(02) VALUE X'002C' データの受け取り側がこのコードをカンマと判断してくれませんでした・・・ コードはU+002Cとなっているのでそのとおりに設定したかったのですが、「+」が設定できないため、上記のような書き方としました。 何かぜんぜん別の書き方をするのでしょうか? 質問の内容がわかりづらく申し訳ありませんが、どなたか知恵を貸していただければと思います。 よろしくお願いします。

専門家に質問してみよう