COBOL初心者にとっての登竜門とも言えるMOVE命令、実は一度しくみがわかれば、案外スッキリ理解できます。
この記事では、COBOLのMOVE命令を使ったデータ転記の基本から応用までを、噛み砕いて紹介します。
文字と数字の扱いの違いや、桁数が合わないときの挙動も、実際のコードを交えて丁寧に解説します。最初はよくわからなかったMOVE命令が、読み終える頃には「ああ、そういうことか」と思えるはずです。
この記事で学べること
・MOVE命令の基本構文と意味
・データ型の違いによるMOVEの動作
・桁数が異なるときの扱い方
・実際に試せるサンプルコードの紹介
読み終える頃には、エラーに悩まされることなく、すっとデータが移せる自分に気づくはずです。さて、MOVEの世界に一歩踏み込んでみましょう。
COBOL MOVE命令とは?データ転記の心臓部を理解しよう
COBOLでプログラムを書くとき、多くの場面で使われるのが「データを移す操作」です。
例えば、入力された名前を表示用の変数にコピーしたいときや、計算結果を別の変数に渡したいとき。そんなときに登場するのがMOVE命令です。
イメージとしては、「荷物をひとつの箱から別の箱に移す」ようなものです。変数という名の箱に入っている値を、別の箱にそっくりそのまま引っ越しさせる命令。それがMOVEなんです。
「データ転記って何?」と感じている人も、日常の動作に例えるとすっと理解できるはずです。お気に入りのクッキーを、お弁当箱からお皿に移す感覚に近いかもしれません。
MOVE命令は、COBOLにおけるデータの流れを制御する根本的な仕組みです。まずはその役割をしっかりイメージしてみましょう。
COBOL MOVE命令の基本的な書き方(構文)
MOVE コピー元 TO コピー先.
とてもシンプルですね。たったこれだけで、値の移動ができてしまいます。構文をもう少し分解して見てみましょう。
- MOVE:命令の名前。「これから値を移すよ」と宣言している
- コピー元:送り出し項目。ここに入っている値が移動される
- TO:コピー先を指定するための合図
- コピー先:受け取り項目。ここに値がコピーされる
- ピリオド(.):COBOLでは命令の終わりを意味する記号
見た目がシンプルなだけに、動作をちゃんと理解しておくことが大事です。逆方向に書いてしまうと、期待どおりに動きません。
送り出し項目と受け取り項目とは?
MOVE命令の「送り出し項目」には、実際に移したい値が入った変数や、決まった値(例えば数字や文字列)を直接書くことができます。「受け取り項目」には、コピー先となる変数を指定します。
例えば、こんな変数があるとしましょう。
WORKING-STORAGE SECTION. 01 NAME-A PIC X(10) VALUE "TANAKA". 01 NAME-B PIC X(10).
この状態で、次のように命令を書けば、
MOVE NAME-A TO NAME-B.
NAME-Aに入っていた“TANAKA”が、NAME-Bにコピーされるという動きになります。
送り出し項目には、数値や文字列などいろいろ指定できますが、必ず「移したい内容」がちゃんと入っている必要があります。受け取り項目も、きちんと受け入れられるように宣言されている必要があります。
簡単なデータ転記の例を見てみよう
では実際に、文字データの転記例を見てみましょう。
WORKING-STORAGE SECTION. 01 NAME-A PIC X(5) VALUE "YUKI". 01 NAME-B PIC X(5).
MOVE NAME-A TO NAME-B.
実行前:
- NAME-A:YUKI
- NAME-B:(空)
実行後:
- NAME-A:YUKI
- NAME-B:YUKI
このように、MOVE命令を使えば、簡単にデータを別の場所に移すことができます。コピー元とコピー先が同じ桁数であることを確認してから使うのがポイントです。
数字の場合も考え方は同じです。ただし、数値の桁数が合わないときには、ちょっとしたルールがあるので、それは次の章で解説していきます。
最重要!MOVE命令のデータ転記ルール
ここがMOVE命令を使いこなすための要!
MOVE命令はシンプルに見えて、実は「何をどこに移すか」によって結果が大きく変わります。特に注意したいのが、データの型と桁数が違う場合の転記ルールです。
うっかりミスをすると、「えっ、こんな値になるの!?」とびっくりすることも。次のセクションで、文字と数字の型が違うときや、桁数が合わないときのルールを詳しく見ていきましょう。
データ型が違う!文字と数字の転記ルール
MOVE命令では、文字データと数字データを相互に転記できます。ただし、データ型が違う場合は自動で型変換されることがあります。うまく変換されるケースもあれば、ちょっと不思議な結果になることもあります。
よくある組み合わせと結果を整理してみましょう。
- 数字 → 文字:数値が文字としてコピーされます(右寄せ)
- 文字 → 数字:数字っぽい文字列なら数値としてコピーされます。数字以外の文字が含まれると予期せぬ値になることがあります
例えば、こんな宣言をしたとします。
01 STR-A PIC X(5) VALUE "12345". 01 NUM-B PIC 9(5).
MOVE STR-A TO NUM-B.
結果:数値としてコピーされます。ただし、文字列に空白やアルファベットが混じっているとエラーや意図しない動きになることがあります。
逆に、数字から文字に転記する例も見てみましょう。
01 NUM-A PIC 9(5) VALUE 67890. 01 STR-B PIC X(5).
MOVE NUM-A TO STR-B.
結果:STR-Bには "67890" が文字列として入ります。
型が違うときには、「思った通りの値が入ってるか?」を確認するクセをつけると安心です。
桁数が合わない!データ転記時の桁合わせルール
MOVE命令では、送り出し項目と受け取り項目の桁数(長さ)が違う場合、自動で桁合わせが行われます。ただし、切り捨てられたり、埋められたりするので注意が必要です。
まずは文字データのパターンから。
- 送り出し項目が長い:受け取り項目に入りきらない分は右側が切り捨てられる
- 送り出し項目が短い:受け取り項目の余った部分は空白で埋められる
例を見てみましょう。
01 STR-A PIC X(8) VALUE "ABCDEFGH". 01 STR-B PIC X(5).
MOVE STR-A TO STR-B.
結果:STR-Bには "ABCDE" が入ります(右側の“FGH”は切り捨て)
次は数字データのパターンです。
- 送り出し項目が長い:左側が切り捨てられることがあります
- 送り出し項目が短い:受け取り項目はゼロで埋められる(左寄せ)
例:
01 NUM-A PIC 9(3) VALUE 45. 01 NUM-B PIC 9(5).
MOVE NUM-A TO NUM-B.
結果:NUM-Bには "00045" が入ります
逆に、長い数値を短い項目に移すと…
01 NUM-C PIC 9(5) VALUE 12345. 01 NUM-D PIC 9(3).
MOVE NUM-C TO NUM-D.
結果:NUM-Dには "345" が入り、左の桁は消えてしまいます
特に数字の切り捨てには注意が必要です。思っていたのと違う数値になっていたら、まずは桁数を見直してみてください。
定数や特殊レジスタもMOVEできる
MOVE命令では、変数だけでなく定数や特殊な値も使えます。つまり、「決まった文字列や数字を、変数にコピーしたい」といった場面でも活躍します。
例を見てみましょう。
MOVE "ABC" TO DATA-A. MOVE 123 TO DATA-B. MOVE ZERO TO COUNT. MOVE SPACE TO TEXT.
MOVE "ABC":文字列をそのまま転記します。
MOVE 123:数字定数を数値項目に入れられます。
MOVE ZERO:全部ゼロになります。数値項目の初期化に便利。
MOVE SPACE:全部空白になります。文字項目をリセットするのに使えます。
定数を使うと、「決まった値を毎回使う場面」や「初期化」がスッキリ書けます。現場でもよく使われるテクニックなので、ぜひ覚えておいてください。
COBOL MOVE命令のサンプルプログラムと解説
ここでは、MOVE命令を実際に動かして結果を確認できるサンプルプログラムを紹介します。文字・数字の転記、桁数の違い、定数の転記、そしてデータ型が異なる場合の動作までを盛り込んだ内容です。
動かすだけで頭に入るので、ぜひ写経して試してみてください。
IDENTIFICATION DIVISION. PROGRAM-ID. SAMPLE-MOVE. DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-STR1 PIC X(5) VALUE "ABCDE". 01 WS-STR2 PIC X(3). 01 WS-STR3 PIC X(8). 01 WS-NUM1 PIC 9(3) VALUE 123. 01 WS-NUM2 PIC 9(5). 01 WS-NUM3 PIC 9(2). 01 WS-ALPHA-NUM PIC X(5). 01 WS-NUM-ALPHA PIC 9(3). PROCEDURE DIVISION. DISPLAY "--- 文字項目間のMOVE ---". DISPLAY "転記前 STR1=[" WS-STR1 "]". MOVE WS-STR1 TO WS-STR2. *> 桁数小:右側切り捨て DISPLAY "MOVE STR1 TO STR2=[" WS-STR2 "]". MOVE WS-STR1 TO WS-STR3. *> 桁数大:右側スペース埋め DISPLAY "MOVE STR1 TO STR3=[" WS-STR3 "]". DISPLAY "--- 数字項目間のMOVE ---". DISPLAY "転記前 NUM1=[" WS-NUM1 "]". MOVE WS-NUM1 TO WS-NUM2. *> 桁数大:左側ゼロ埋め DISPLAY "MOVE NUM1 TO NUM2=[" WS-NUM2 "]". MOVE WS-NUM1 TO WS-NUM3. *> 桁数小:左側切り捨て(※警告対象) DISPLAY "MOVE NUM1 TO NUM3=[" WS-NUM3 "]". DISPLAY "--- 定数・形象定数のMOVE ---". MOVE "HELLO" TO WS-STR2. DISPLAY "MOVE 'HELLO' TO STR2=[" WS-STR2 "]". *> 切り捨て MOVE 987 TO WS-NUM2. DISPLAY "MOVE 987 TO NUM2=[" WS-NUM2 "]". *> ゼロ埋め MOVE ZERO TO WS-NUM1. DISPLAY "MOVE ZERO TO NUM1=[" WS-NUM1 "]". MOVE SPACE TO WS-STR1. DISPLAY "MOVE SPACE TO STR1=[" WS-STR1 "]". DISPLAY "--- データ型が異なるMOVE(注意) ---". MOVE WS-NUM1 TO WS-ALPHA-NUM. *> 数字→文字(暗黙変換) DISPLAY "MOVE NUM1 TO ALPHA-NUM=[" WS-ALPHA-NUM "]". MOVE "456" TO WS-NUM-ALPHA. *> 文字(数字)→数字(暗黙変換) DISPLAY "MOVE '456' TO NUM-ALPHA=[" WS-NUM-ALPHA "]". MOVE "XYZ" TO WS-NUM-ALPHA. *> 文字(非数字)→数字(不定値の可能性) DISPLAY "MOVE 'XYZ' TO NUM-ALPHA=[" WS-NUM-ALPHA "]". STOP RUN.
--- 文字項目間のMOVE --- 転記前 STR1=[ABCDE] MOVE STR1 TO STR2=[ABC] MOVE STR1 TO STR3=[ABCDE ] --- 数字項目間のMOVE --- 転記前 NUM1=[123] MOVE NUM1 TO NUM2=[00123] MOVE NUM1 TO NUM3=[23] --- 定数・形象定数のMOVE --- MOVE 'HELLO' TO STR2=[HEL] MOVE 987 TO NUM2=[00987] MOVE ZERO TO NUM1=[000] MOVE SPACE TO STR1=[ ] --- データ型が異なるMOVE(注意) --- MOVE NUM1 TO ALPHA-NUM=[123 ] MOVE '456' TO NUM-ALPHA=[456] MOVE 'XYZ' TO NUM-ALPHA=[???] *> 実行環境によって結果が異なるか、エラーになる可能性あり
各MOVE命令が何をしているか、順番に解説していきます。
① MOVE WS-STR1 TO WS-STR2:STR1は5文字、STR2は3文字。STR1から3文字だけが切り取られてSTR2にコピーされます。
② MOVE WS-STR1 TO WS-STR3:今度はSTR3の方が大きいので、余った3文字分はスペースで埋められます。
③ MOVE WS-NUM1 TO WS-NUM2:NUM1は3桁、NUM2は5桁。左側にゼロが追加されて5桁の数字になります。
④ MOVE WS-NUM1 TO WS-NUM3:桁数が足りないNUM3に転記。先頭の1が消え、後ろの「23」だけが残ります。こういった切り捨てには要注意です。
⑤ MOVE "HELLO" TO WS-STR2:HELLOの5文字から、3文字だけがSTR2に入り、残りは無視されます。
⑥ MOVE 987 TO WS-NUM2:3桁の数値が5桁に転記されるので、前にゼロが2つ足されて「00987」になります。
⑦ MOVE ZERO / MOVE SPACE:数字項目は「000」に、文字項目はすべてスペースになります。初期化やリセットに便利です。
⑧ MOVE WS-NUM1 TO WS-ALPHA-NUM:数字を文字に転記すると、文字列としてコピーされます。見た目は数字ですが、型は文字になります。
⑨ MOVE "456" TO WS-NUM-ALPHA:文字列が数字として扱える場合はそのまま転記されます。
⑩ MOVE "XYZ" TO WS-NUM-ALPHA:文字列が数字でない場合は、実行環境によっては不定値が入るか、プログラムが止まることもあります。
MOVE命令のクセが掴めてきたら、どんなデータでも自在に扱えるようになります。いろんなパターンを試して、自分の手で動かして確かめてみるのがいちばんの近道です。
MOVE命令を使う上での注意点
MOVE命令は便利ですが、気づかぬうちにミスを招くケースもあります。「なんでこんな値になったの?」という現象は、大体ここに原因があります。
特に注意!というポイントをまとめました。
- 桁数が合わないときの切り捨て
送り出し項目が長すぎると、右側または左側が容赦なく切られます - 数値 → 数値 の左側切り捨て
特に上位桁が落ちると、金額やIDが変わってしまう恐れがあります - 文字 → 数値 の転記
数字として解釈できる文字列なら通りますが、アルファベット混じりだと不定な値になります - 数値 → 文字 の転記
数字がそのまま文字として右寄せで入ります。意図せぬスペースや桁ずれに注意 - DISPLAYしても思った値が出ない
デバッグ時はDISPLAY命令で中身と桁数を確認しましょう
MOVEはシンプルに見えて、ちょっとしたミスが命取り。必ず項目の型と長さをチェックするクセをつけておくと安心です。
【まとめ】COBOL MOVE命令でデータ転記をマスター
MOVE命令はCOBOLの中でも最初に覚えるべき基本操作です。見た目はシンプルですが、データ型や桁数によって動きが変わるので、実際に手を動かして試すことが理解のカギになります。
今回の内容を通して、
- MOVE命令の書き方と意味
- 文字や数値の転記ルール
- 定数や形象定数の活用方法
- 気をつけたい転記の落とし穴
をしっかり学べたはずです。
これでMOVE命令の基本はバッチリ!
迷ったらサンプルを見返して、どんどん自分でコードを書いて確かめていきましょう。
- MOVE命令は「値を別の変数にコピーする」ための基本命令
- 送り出し項目と受け取り項目の型や桁数に注意が必要
- 定数や形象定数(ZERO、SPACEなど)も使える
- データ型の違いや桁数の不一致で、予期しない動作になることがある
- DISPLAY命令を使って、転記結果をこまめに確認するとミスを防ぎやすい
【関連記事】
0 件のコメント:
コメントを投稿
注: コメントを投稿できるのは、このブログのメンバーだけです。