• ベストアンサー
  • 困ってます

COBOL 9(02)で定義した変数にマイナス値をセットすると?

COBOLについて教えてください。 現在、既存のシステム(COBOL)を机上でチェックしているのですが、 関数からの戻り値変数を (例)RC 9(02) で定義して、 異常発生時に、MOVE -1 で値セットしているロジックがありました。 S9タイプではないので、誤動作を起こすと思うのですが、 実際このような処理を行うと、変数RCにはどんな値がセットされるのでしょうか? 実行環境が無いので、動作確認ができず、困っています。(バグかと思うのですが、該当のロジックは幸いにも今まで実行されていなかったようです) よろしくお願いします。

共感・応援の気持ちを伝えよう!

  • 回答数6
  • 閲覧数3926
  • ありがとう数3

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

  • ベストアンサー
  • 回答No.1
  • Yeti21
  • ベストアンサー率47% (396/830)

コンパイラのメーカーや項目のデータタイプによって保持する データの形式は異なります。 何れにしても、RCが-1かと聞いても否と言う結果になります。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

ありがとうございます。 RC = -1 の判定が不可であることが明らかになっただけで、有難いです。

関連するQ&A

  • 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で文字変数Aと絶対に一致しない特殊値は?

    COBOLでプログラミングをしています。ある変数AとBがあり、どちらも領域はPIC X(1)です。 この変数Aを、いかなるときでも変数Bと一致させたくないとき、Bに入れる「END OF FILE」のような特殊な値って無いのでしょうか? そのような値が存在するならば、AかBにその特殊な値を入れておけばいいと思うのですが、 もし無いとすれば、以下のような処理をスマートにCOBOLで作るには、どのように作るのが一般的ですか? PERFORM文を用いて終了条件がA=Bのとき、 最初の処理では必ずPERFORMの中の処理を行い、 2回目からは終了条件で実行するかどうかを判定するような処理 よろしくお願いします。

  • 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); } --------------------------------------------------

その他の回答 (5)

  • 回答No.6
  • Yeti21
  • ベストアンサー率47% (396/830)

何か意味を誤解されているようです。 符号付を文字として扱えば文字化けするのは当然です。 だから、そういう用途で使うのが間違っているといっているだけです。 つまり、画面や帳票の表示項目に「S9(2)」なんて使いません。 符号付なら、「-9」と使うのがあたりまえということです。 >質問にある関数がどういう目的のものか分かりませんが、関数のリターンコードを表示等をする目的があるなら、表示できる変数等にMOVEしてから行う必要があります。 >符号付のまま表示すると、既に書いている通り文字化けしてしまいます。 当然そうです。 問題になっているのは、「戻り値の変数」というのを忘れているのでは ないでしょうか? 質問内容から、符号付の「戻り値の変数」をそのまま表示項目として使っている 可能性はほとんどゼロに近いと思います。 (普通そんな使い方はしませんから) それを、表示に使用するとも書いていないのに、「化けるから意図的に」 という理論に無理があると思います。 作成者の意図は知りませんが、バグの可能性の方が高いと思いますよ。 現実に-1が発生すると誤動作の可能性があるわけですから。

共感・感謝の気持ちを伝えよう!

  • 回答No.5

No4さんは、COBOLを知っている人でしょうか? 数値項目を端末に表示したり帳票出力する場合、COBOLでは編集項目(=文字)か外部10進(=文字であるが、数値としても扱える)にMOVEするのが一般的です。 元の数値項目は、2進数、内部10進でも同じことです。 編集項目を使わず外部10進を出力するとき、符号付になっていると最終桁に符号情報も持っているために文字化けします。 質問にある関数がどういう目的のものか分かりませんが、関数のリターンコードを表示等をする目的があるなら、表示できる変数等にMOVEしてから行う必要があります。 符号付のまま表示すると、既に書いている通り文字化けしてしまいます。 普通、リターンコードは2進で2バイトか4バイトにする場合が多いでしょうが、この質問では関数の内容まで触れられていないので、その辺はなんとも答えられません。

共感・感謝の気持ちを伝えよう!

  • 回答No.4
  • Yeti21
  • ベストアンサー率47% (396/830)

No.2さんの意見に対して老婆心ながら、 データの持ち方に関しては良いのですが、符号付数値項目を文字として 扱うこと自体が本来誤った考え方です。 そこで文字化けを意識するようなことは、皆無とは言いませんが 一般的な使い方では有りません。 さらに、この質問例のように関数のリザルト値を文字で扱うなんてことは まずありません。 用途的にもそうですが、そういう意味でも、意図的にというのは考えにくいです。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

出張でお礼が遅くなり、申し訳ありません。 ご教示ありがとうございました。

  • 回答No.3

#2回答者です。 一箇所訂正します。 <訂正前> ところが受け取り側を符号付きにすると、'F0D1'という内部形式 <訂正後> ところが受け取り側を符号付きにすると、X'F0D1'という内部形式

共感・感謝の気持ちを伝えよう!

  • 回答No.2

汎用機なのかPC環境なのか、どこのメーカーの何というコンパイラなのかが分からないと、適切な回答はできません。 私が知っているのは某汎用機メーカーのCOBOL85ですが、その場合について回答します。 「S」がないので、MOVEすると符号は欠落します。 「PIC 9(02)」の後ろには、COMP、COMP-3などは指定されていないのですね? そうすると外部10進になります。 EBCDICやEBCDIKといったコードなら、'F0F1'という内部形式になります。 これは、文字で'01'と書いた場合と同じです。 ところが受け取り側を符号付きにすると、'F0D1'という内部形式になり、これは表示すると'0J'という文字になります。 つまり、符号付で表示すると、最少の桁が +n→X'Cn'=文字'A'~'I' -n→X'Dn'=文字'J'~'R' に文字化けしてしまうのです。 したがって、バグではなく、COBOLを知っている人が文字化けを避けるためにそうしているのだと思います。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

出張でお礼が遅くなり、申し訳ありません。 ご教示ありがとうございました。 (ちなみに、使用しているのは某汎用機メーカのCOBOL85です)

関連するQ&A

  • 実行シェルからCOBOLへパラメータを渡したい。

    実行シェルで変数に値を直書きで代入し、その変数の値をCOBOL側で使用したいのですが、シェルでの宣言のやり方とCOBOLでの受け取り方が分かりません。 どなたか分かる方お返事お願いします。。。

  • COBOLソースに記述するホスト変数を使用したSELECT INSER

    COBOLソースに記述するホスト変数を使用したSELECT INSERT分に関する質問です。 COBOLのソースに下記のようなSQL分を記述した際、どのような制御でホスト変数にはどのような値が代入されるのでしょうか? SELECT MAX(columnA) INTO :H1010:H2020 FROM A_TABLE WHERE …(以下抽出条件) ※H1010及びH2020はホスト変数定義しているものとします。 SELECTを行った項目数とINTO句にて指定した変数の数が異なる場合、エラーとなる記憶があります。 また、複数のホスト変数を使用する場合、カンマ区切りが必要だった記憶もあります。 実際に実行したところ、エラー等無く実行されました。結果を見るとH1010には値が代入され、H2020は初期値のままでした。 どのような制御でこの結果になっているのでしょうか? 参考までに、DBMSは「symfoware」です。 もしご存知の方がいらっしゃいましたら、ご教授頂けると助かります。よろしくお願いします。

  • 別々の変数なのに同じ内容がセットされてしまう

    OS:Win7 Pro(32bit) VB.net:Visual Studio 2010 現在、vb.net2010を使用して、あるアプリケーションの改造を行っておりますが、 二つの別々の変数にもかかわらず、一方の変数に値をセットすると もう一方の変数にも値がセットされるという現象が発生しています。 APの構造は以下の通り(概略) Dim 変数A as list(Of cSubStr_A)(パブリック変数) Private Sub ルーチンA Dim  変数B as cSubStr_B 変数B.SubString. = 変数A.SubString(インデックス) 変数B.SubString.left = 123 End Sub 変数Aについては、他のサブルーチンなどで値がセットされています。 変数A、変数Bの配下には、leftという変数があります。 現在、変数B.SubString.left = 123が実行されたときに、 変数A.SubString.leftに対しても同じ値がセットされてしまいます。 (ステップ実行で確認) 他のプログラマが作成したものなので、 詳細は現在不明なのですが、変数Aと変数Bは別の変数なのに、 どうして変数B配下の変数に値がセットされると、変数Aに 反映されてしまうのかがわかりません。 別の人に聞いてみたのですが、変数名は違うけれど、 アドレスが同じところを見ているので、こういう現象になるのでは? という指摘がありました。 今までこういう現象にで合ったことがないので、 手がかりがつかめない状態です。 なにかヒントがあれば、お教え願えればと 思います。 以上、よろしくお願い申し上げます。

  • VBAで変数定義の必要性について

    ==(1)================= Dim abc As Long abc = 5 ===================== ==(2)================= abc = 5 ===================== あるパソコンで(2)のコードで 「オブジェクトまたはライブラリが見つかりません」 とのエラーになります。(多数のパソコンでエラーになりません) VBAに対して、変数が定義されなくても、値をセットされた際に、 変数属性を与えるとのように考えれば良いですか。 以上、よろしくお願いします。

  • 動的に変数をセット後他クラスから参照する場合

    コンストラクタで変数にセットした後 他のクラスでインスタンスを生成することなく セットした変数を参照したいのですが、 staticにすると、他クラスで変数を変更することも できてしまいます。他の方法がありますでしょうか? 変数はprivateにして、getterで取得するという方法も 考えられますが、static finalな変数として扱う方法が あるか、お分かりの方いらっしゃいましたら教えてください。 Javaを初めて1ヶ月なので、見当違いの質問でしたらご指摘ください。 例) Class A{  static final String aaa; A(String paraStr){ aaa = paraStr; } } Class B{ static void main(String[] args){ new A("test"); } } Class C{ void chStr(){ System.out.println(A.aaa); A.aaa = "changeStr" System.out.println(A.aaa); } } 期待する値 test test もしくは、実行時にfinalの値は変更できない等のException 宜しくお願いします。

    • ベストアンサー
    • Java
  • COBOL OCCURSで指定したデータの参照の仕方

    IBM COBOL でプログラムを作成しています。 初歩的な質問で恥ずかしいのですが、どなたか教えていただけますか。 まず、以下のようなTABLEを定義しました。 01 A-TABLE. 03 B OCCURS 100. 05 C PIC X(08) VALUE SPACE. 05 D PIC X(02) VALUE SPACE. 05 E PIC X(08) VALUE SPACE. 05 F PIC X(05) VALUE SPACE. 05 G PIC X(05) VALUE SPACE. 05 H PIC X(05) VALUE SPACE. その後に、INPUTファイルからREADしたデータのうち、必要な部分だけを 該当のTABLEに添え字を使用して代入していく処理を作成したいと思っています。 その場合に、上記の「C」~「H」に代入するにはどうすればよいでしょうか? また後続の処理で直接その値を参照したいのですが、どうすれば良いでしょうか? 私の考えられる範囲で以下のようにプログラムしましたが、 実行時に「OUTSIDE THE REGION OF THE TABLE.」というようなエラーが出力されてしまいました。 MOVE I TO C(IDX1) MOVE J TO D(IDX1) MOVE K TO E(IDX1) MOVE L TO F(IDX1) MOVE M TO G(IDX1) MOVE N TO H(IDX1) どなたかよろしくお願いします。

  • COBOLのCALL文がいまいちつかめません。

    いつもお世話になっています。 WINDOWSでCOBOL85を使いながら、COBOLの勉強をしています。 JAVAを基本情報試験のために勉強したくらいの初心者です。 シーケンシャルファイルでマッチング処理を行う、 小さなプログラムを課題としている途中、 CALL文を使ってサブプログラムを作ってみてくださいと言われました。 そこで質問なのですが、 メインプログラムの集団項目をUSING指定で引数として、 サブプログラムで受け取り、処理をするまではいいのですが、 戻り値をどのようにして受け取ればいいのかが イメージがつかめません。 ・戻り値を受け取るための命令 ・戻り値は1つだと思うのですが、どの変数?に返ってくるのか (集団項目ごと返ってくる?) など、何かあればご助言をいただけないでしょうか? ソースは次の通りです。 よろしくお願いいたします。 ■メイン IDENTIFICATION DIVISION. PROGRAM-ID. MACHING_TEST. (省略) WORKING-STORAGE SECTION.   01 JUDGE_F.    03 KEY_F     PIC 9(01).    03 CHANGE_F     PIC X(06).    03 EXCEP_M     PIC 9(01). (省略) CALL "JUDGE_FEMALE" USING JUDGE_F ON EXCEPTION   DISPLAY N"エラーです。プログラムを終了します"   STOP RUN   NOT ON EXCEPTION    IF EXCEP_M = 9 THEN MOVE "ERRER!" TO FEMALE_OUT ELSE  IF EXCEP_M = 1 THEN MOVE CHANGE_F TO  FEMALE_OUT  END-IF    END-IF    END-CALL. (以下略) ■サブ IDENTIFICATION DIVISION. PROGRAM-ID. JUDGE_FEMALE. DATA DIVISION. LINKAGE SECTION. 01 JUDGE_F.  03 KEY_F PIC 9(01).  03 CHANGE_F PIC X(06).  03 EXCEP_M PIC 9(01). PROCEDURE DIVISION USING JUDGE_F. IF KEY_F = 1  THEN   MOVE "オトコ" TO CHANGE_F   MOVE 1 TO EXCEP_M  ELSE   IF KEY_F = 2 THEN  MOVE "オンナ" TO CHANGE_F  MOVE 1 TO EXCEP_M ELSE  MOVE 9 TO EXCEP_M END-IF END-IF. PROGRAM-END.  STOP RUN.

  • コンパイルエラー 変数が定義されていません

    コンパイルエラー 変数が定義されていません 下記URLの質問を参考にVBAに挑戦しています http://questionbox.jp.msn.com/qa5863136.html 下記コードを既存のACCESSの中に新規作成したコマンドボタンに 組み込んで実行したところ 下記変数にコンパイルエラー 変数が定義されていませんと出てきます、 objConnection objRecordSet strkanri arrkanri 自分なりに Dim ~としたのですがうまくいきません どのように変数を宣言してよいかお教え願います。 記述コード Private Sub コマンド0_Click() Const adOpenStatic = 3 Const adLockOptimistic = 3 Const ForReading = 1 Set objConnection = CreateObject("ADODB.Connection") Set objRecordSet = CreateObject("ADODB.Recordset") objConnection.Open _ "Provider = Microsoft.Jet.OLEDB.4.0; " & _ "Data Source = c:\test\商品管理.mdb" objRecordSet.Open "SELECT * FROM 商品TBL", _ objConnection, adOpenStatic, adLockOptimistic Set objFSO = CreateObject("Scripting.FileSystemObject") Set objFile = objFSO.OpenTextFile("C:\test\管理.csv") Do Until objFile.AtEndOfStream     strkanri = objFile.ReadLine     MsgBox strkanri     arrkanri = Split(strkanri, ",")     objRecordSet.Filter = "納入日=" & arrkanri(0) _               & " AND 仕入NO ='" & arrkanri(1) & "'"     Do While (Not objRecordSet.EOF)       objRecordSet("管理コード") = arrkanri(2)       objRecordSet.Update       objRecordSet.MoveNext     Wend   Loop objRecordSet.Close objConnection.Close End Sub

  • select文の戻り値を変数に格納したい。

    select文の戻り値を変数に格納したい。 アクセスの選択クエリで以下の様なクエリをつくる。 select count(管理no) from 割り当てテーブル where 管理no = formのテキストボックスに書かれた値; doCmd.openQueryで実行させると画面が開きクエリの結果が表示される。 この値は必ず一つになるはずでその値を変数に取り込み次の処理を行いたい。 現在はクエリを実行後、フォームを開きなおし別の要素にクエリの結果を 表示させその値を取っている。なるべくならフォームを開きなす事をした くないので最初の実行時に変数として取り込みたい。

  • function内での定義

    functionの中で変数に値を入れ、function外で使用したいのですがうまくできません。 例えば var ppc = null; function OpenDetail(){ ppc = "fggr"; } document.write("////"+ppc); という場合、出力は「////null」ですが期待している結果は「////fggr」です。 javascriptは上から順番に実行する、functionはどこかからあえて呼ばなくても実行される、ローカル変数を別の場所で使うにはグローバル変数の定義が必要、を踏まえてのソースなのですが、どこが間違っているのか教えてください。