このたび、まったくの未経験の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の(お堅い規格を書き写しただけでない)解説のサイトなどあれば、ご紹介いただけますでしょうか。
No.1
- 回答日時:
COBOLはしばらく使っていませんが、どなたからも回答がありませんので
記憶を頼りですがお答えします。
先ず、COMP指定がある等は難しく考えないで良いです。
内部で演算の際に、その処理系の演算に適したデータ形式が取られる・・・
位に考えてください(ちょっと乱暴ではありますが)
詳しく知りたかったらマニュアルに書かれています。
するとずっとシンプルに見えてきます。
MOVE N1 TO X1
等、D1からX1へというパターン・・・
数値項目を文字項目に転記・・・は出力の為の編集では頻繁に使います。
桁数にだけは気をつけてください。
MOVE D2 TO X2
想像された”a△△"の意味は解りませんが、結果は”097”でしょう。
MOVE D2 TO N2
MOVE N2 TO X2
は問題ありませんが、後者は桁落ちする場合があります。
上記のすべての例は、符号は考慮されていない(すべて+)事にも注意してください。
・蛇足ですが、数値項目は文字項目に転記できるが、その後演算には使用できない。
・文字項目から数値項目への転記はできない。
(データが確実に数字なら実行時エラーにはならないが・・・)
お役立ちサイト を検索してみましたが、
http://www.koganet.ne.jp/~kitagawa/shome/index.h …
http://www.t3.rim.or.jp/~buchi/proco.html
処理系は違っても、文法規格は国際統一されていますので役に立つのではないでしょうか!
ありがとうございますっ!ちょっと感動入っています。
むかしCを触っていたのでその中でビット仕様を意識する習慣がついてしまったということになりましょうか。
ですと、PICの型(?)を問わず、数値であれば中身のビットを気にせずに転記できるということになるわけでしょうか。であれば、型によるちがいはコンパイラがうまくやってくれるということでしょうか。
97が'a'と解釈できるのは、文字'a'のコードが(たしか)97であるところからきてます。
ちなみにビットで定義した
01 B1 PIC 1(16) BIT
は、転記に際しては文字通りビットを写すだけになりましょうか。たとえば
MOVE '0000000001100001' TO B1 (←97:10進)
に対して
MOVE B1 TO X1
MOVE B1 TO D1
とかやると、それぞれ'a'と97(あれ符号がない?…)になったりするわけでしょうか。
なんかやっぱり難しいですね。=_=
No.2ベストアンサー
- 回答日時:
ShiozawanoYukiさんはCOBOL未経験とのことですが
ご質問のような数値と文字との間の転記はCOBOL上規約はありますが実際には例外的にしか行われないでしょう。
COBOLコードの厳しい社内ルールを定めてる会社では数値と文字との間の転記は禁止されています。
(桁あふれ、計算時に不能や範囲外の値になったり、ひどいとエラー終了になるか引き起こしたりするからです。)
転記する場合は同じ桁数同士のみで行う社内ルールを決めているところもあります。
(桁あるれ対策です。)
*数値と文字との間の転記はデータの定義で対処します。
COBOLのデータは構造体になっています。
(ご質問のようなデータ構造はフラグ、繰り返しや一時的な変数などには使用しますが普通はレベルを使用したデータ構造で定義します。)
>MOVE N1 TO X1
のコードのデータは
01 X.
02 X1 PIC 99.
01 N1 PIC 99.
などと定義し転記後に文字で使用する場合は”X”(2桁)を使用します。
しかし、ただ”N1”を文字として使用するだけである場合は
01 NX.
02 N1 PIC 99.
と定義し、”NX”(2桁)を文字として使用する方法もあります。
(これは9タイプとXタイプの内容が同じため利用できますがバイナリなどでは転記してから利用します。)
逆に数値から文字に転記する場合は
01 D2 PIC 9(4) COMP VALUE 97.
01 X2.
02 X9 PIC 9(4).
01 XR REDEFINES X2.
02 XR1 PIC X(02).
02 XR2 PIC X(02).
MOVE D2 TO X9.
となり文字として使用する場合は”X2”(4桁)を使用します。
”X2”は数字から転記されたので”0097”が入っています。
”X2”を”△△97”にする場合は”X9”を”ZZZ9”または”ZZZZ”(”Z(04)”)の編集項目で定義すれば実現できます。
(”0”(”0000”)を転記した場合に”ZZZ9”は”△△△0”、”ZZZZ”は”△△△△”になります。)
4桁を上2桁と下2桁で使用する場合は上記のように”X2”を再定義(REDEFINES)し”XR1”、”XR2”を使用します。
(個人的には最上位レベルでの再定義は避けるようにしています。)
*実は転記を悩まずに行うには、実は上の厳しい社内ルールと記した”同じ項目種類、桁数でのみ転記”を行い、項目種類の変換はデータ定義で行うのがポイントです。
*COBOLを理解するためにはデータ構造を理解することが良いと思います。
(命令は他の言語より少なく対応が容易です。ただ、少ない分、自分でコード作成が必要です。ここが他の言語しか知らないプログラマには大変かもしれません。)
後、ピリオドを付けないとのルールがないなら、命令の最後にはピリオドを付けましょう。
(IF文の中では逆に付けません。そのため逆にピリオドがトラブルの原因ともなり、モジュールの最後だけに付けるとの社内ルールを決めているところもあります。)
>また、COBOLの(お堅い規格を書き写しただけでない)解説のサイトなどあれば、ご紹介いただけますでしょうか。
残念ですがCOBOLは他の言語と違い歴史がある割りには定番類があまりありません。
最新のCOBOLは他の言語のように色々な命令が追加されているようですが、本来は当時のプログラミングの専門家以外でもプログラムを作成することを目標に設計されています。
(当時といっても、もう半世紀も前の話ですが・・・)
そのため、元は限られた命令と定義されたデータ構造だけでプログラムが作成できます。
(バッチであればファイル処理と帳票処理を中心に憶えれば良いと思います。問題はオンラインとWebの場合ですが真似からなれるしかないかもしれません。)
参考になるでしょうか?
No.3
- 回答日時:
文字タイプを数字タイプにMOVEするのは良くないことですね
01 A PIC XX.
01 B PIC 99.
で
MOVE A TO B
は
COMPUTE B = A
と同じです・・・・
★
01 A.
02 A-R PIC 99.
として
IF A NUMERIC
MOVE A-R TO B
ELSE
MOVE 0 TO B.(数値以外であればとりあえず0にする)
★
01 C PIC 9(4) COMP VALUE 97.
これは 一度
数値項目の
01 D PIC 9(4).
01 D-R REDEFINES D PIC XXXX.
で
MOVE C TO D.
元データにサインがある時はPICのところでS9(4)にして、MOVEで受取ると駄目ですね。
この場合は、
01 E PIC S9(9).
01 F PIC -------.や ZZZZZZ-.の編集タイプにすれば
MOVE C TO E.
MOVE E TO F.の2回MOVEですね.
BITタイプもこれの応用です
でも、昔と違い、COMPやCOMP-3などはあまり使わなくても良いのでは・・・・メモリも大きくなったし、レコード長の制限も緩和されているから・・・・
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) COBOL数値転記をCOPY句内での仕様 6 2022/06/15 18:48
- Excel(エクセル) マクロだと数式が表示される 2 2022/09/10 14:48
- Excel(エクセル) 表示形式、文字列セル(列)に数式を入力するには マクロ 1 2022/09/18 10:53
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- 数学 3次対称群S3はシロー部分群で因数分解できない この問題の証明が分かりません。できる範囲で教えていた 1 2022/12/13 13:10
- Visual Basic(VBA) 【VBA】写真の縦横比を変えずに貼り付ける 5 2023/06/13 11:42
- Excel(エクセル) エクセルで同じ数字同士を自動で線で結ぶVBAを教えてください 6 2022/04/26 23:13
- Excel(エクセル) エクセル VBA For Next 繰り返しの書き方を教えてください 6 2022/09/01 14:11
- Visual Basic(VBA) 【VBA】Excelの特定範囲のセルを画像で保存したい 2 2023/01/25 13:06
- Excel(エクセル) VBAで組み合わせ算出やCOUNTIFSの処理を高速化したいです。 4 2022/04/07 02:38
このQ&Aを見た人はこんなQ&Aも見ています
-
性格の違いは生まれた順番で決まる?長男長女・中間子・末っ子・一人っ子の性格の傾向
同じ環境で生まれ育っても、生まれ順で性格は違うものなのだろうか。家庭教育研究家の田宮由美さんに教えてもらった。
-
COBOLで文字タイプを数字タイプに変換する方法
その他(プログラミング・Web制作)
-
S9タイプからXタイプにデータは移行できるのか。(COBOL)
その他(プログラミング・Web制作)
-
COBOLのS9タイプからXタイプへ変換する過程
その他(プログラミング・Web制作)
-
-
4
COBOLのMOVEで桁数が異なる場合
その他(プログラミング・Web制作)
-
5
【COBOL】文字列から数値項目に転記するにあたって
その他(プログラミング・Web制作)
-
6
COBOLで集団項目から符号付き数字項目へのMOVEの結果は?
その他(プログラミング・Web制作)
-
7
COBOLについて
その他(プログラミング・Web制作)
-
8
COBOL 9(02)で定義した変数にマイナス値をセットすると?
その他(プログラミング・Web制作)
-
9
COBOLのINVALID KEYが理解できません
その他(プログラミング・Web制作)
-
10
COBOLの計算方法
その他(プログラミング・Web制作)
-
11
COBOLのIFの入れ子について
その他(プログラミング・Web制作)
-
12
COBOLの基本的な事なのですが。。。
その他(プログラミング・Web制作)
-
13
COBOLによる全角・半角混在→全角に
その他(プログラミング・Web制作)
-
14
COBOLの数字チェック
その他(プログラミング・Web制作)
-
15
COBOL・全角判定
その他(プログラミング・Web制作)
-
16
COBOL、項目末尾に空白がある場合削除の方法その他
その他(プログラミング・Web制作)
-
17
COBOLでの全角文字の判定をしたい。
その他(プログラミング・Web制作)
-
18
COBOLの桁落ち
その他(プログラミング・Web制作)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C# DataTableに最後に追加した...
-
アクセスでウェブ上のデータを...
-
Excel VBAでグループ毎に集計す...
-
webからの帳票表示
-
access vba 『○○件づつ表示』を...
-
エクセルデータをVBで検索でき...
-
Excel VBA で日付を4ケタの数値...
-
Excel VBAでグラフの可変データ...
-
AccessVBAでのExcelメモリ解放
-
【VB.NET】Excelの最終行までの...
-
VB webデータの取得
-
VBAの問題がわからないのでどな...
-
【C#】textBoxの指定行のデータ...
-
VBA 変数名に変数を使用したい。
-
2つ目のレコードの値を取得す...
-
WORD VBA プログラム修正をお願...
-
AccessからExcelへエクスポート...
-
【VB】コンボボックスにデータ...
-
VB.NETの配列にExcelから読み込...
-
DataTableに特定のフィールドが...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「Nullの使い方が不正です」の...
-
【C#】textBoxの指定行のデータ...
-
【VB.NET】Excelの最終行までの...
-
VBAでアクセスDBからデータの取...
-
Excel VBAでフォルダ内の全テキ...
-
C# DataTableに最後に追加した...
-
XMLでデータとして画像を指定す...
-
VBAコンボボックスの内容が反映...
-
MSFlexGrid 行選択状態
-
COBOL数値転記の仕様
-
クリスタルレポートでレコード...
-
非同期のプロセス間通信(パイプ...
-
ActiveReportのdetailをデータ...
-
アクセスでウェブ上のデータを...
-
Excel VBAでグループ毎に集計す...
-
batでレジストリキーから読み取...
-
富士通(汎用機)のAIMについて
-
Web画面のTableから数字を取得...
-
Excel VBAで1週間毎にカテゴリ...
-
エクセルのCSV読み込みについて
おすすめ情報