• ベストアンサー

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