• ベストアンサー

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

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

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

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

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

hitorodage
質問者

お礼

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

その他の回答 (5)

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

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

回答No.5

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

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

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

hitorodage
質問者

お礼

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

回答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を知っている人が文字化けを避けるためにそうしているのだと思います。

hitorodage
質問者

お礼

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

関連する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へパラメータを渡したい。

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

  • COBOLで文字変数Aと絶対に一致しない特殊値は?

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

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

    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に 反映されてしまうのかがわかりません。 別の人に聞いてみたのですが、変数名は違うけれど、 アドレスが同じところを見ているので、こういう現象になるのでは? という指摘がありました。 今までこういう現象にで合ったことがないので、 手がかりがつかめない状態です。 なにかヒントがあれば、お教え願えればと 思います。 以上、よろしくお願い申し上げます。

  • 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」です。 もしご存知の方がいらっしゃいましたら、ご教授頂けると助かります。よろしくお願いします。

  • JSPでの変数定義

    以下のようなJSPが2つあった場合にeclipseではTest2がエラーとなってしまいます。(Test2では変数Xが何者か判断できないため) なお実行時には変数の値が参照できるため通常に動作しますが、Test2でもTest1の1、2の記述をする必要があるのでしょうか? Test1.jsp  1.useBeanでBeanAを使用  2.BeanA.getValue()の値を変数にXに設定  3.Test2.jspのインクルード  4.変数Xの値を使用した処理 Test2.jsp  変数Xの値を使用した処理

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

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

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

  • c言語で定義する変数のアドレス

    c言語の超初心者です。追いえてください。 c言語で2つの変数を定義しています。 char *a; char *b; この2つの変数に値をいれた際の動作で以下のようなことって発生しますか? a="1111" b="2222" aをprintfするとbにいれた値"2222"が表示される。

  • 変数の定義について

    変数の定義について 変数の定義について 他のブックから検索値をVLOOKで転記させるマクロをこちらの掲示板ログなどを 拝見しながら、ツギハギして作成しました。 転記先のシートのA列に区別コードを設けています。 これを基に転記元のブックから社名などを転記させようと思っているのですが、 変数の型宣言が上手くないらしく?転記処理が出来ません。 「Option Explicit」と「変数宣言」をコメントアウトすると動作します。 変数の宣言が違うのだろうか?と宣言部分をコメントアウトして動作確認して いったら、「Dim 検索値 As Double」があると動作しないようなのです。 これをValiantに変更しても動作しませんでした。 この原因が分かる方、どうぞ助けてください。 //////////////////////////////////////////////////////// Dim Base As Workbook, Code As Workbook Dim 範囲 As Range Dim i As Long Dim 会社名 As String Dim 検索値 As Double ←←←←←←←←←←←←←←←←←ここの部分? Sub 一覧() Set Base = Workbooks("転記元.xls") Set Code = Workbooks("転記先.xls") Set 範囲 = Base.Worksheets("転記元").Range("A4:AX5000") On Error GoTo ErrorHandler Do 検索値 = Code.Worksheets("転記先のシート").Cells(i + 2, 1) If 検索値 = "" Then Exit Do 会社名 = Application.WorksheetFunction.VLookup(検索値, 範囲, 6, False) Code.Worksheets("転記先のシート").Cells(i + 2, 2) = 会社名 i = i + 1 Loop Error トラップ開始 ErrorHandler: 会社名 = "" Resume Next End Sub ////////////////////////////////////////////////////////

専門家に質問してみよう