サブルーチンのコーディング

RPG IV サブルーチンは、演算命令のどこからでも処理することができます。すべての RPG IV 命令は 1 つのサブルーチン内で処理することができ、 これらの命令は 9 から 11 桁目の有効な標識で条件付けることができます。 7 から 8 桁目には SR またはブランクを指定することが できます。これらの桁に制御レベル標識 (L1 から L9) を使用することはできません。 しかし、 サブルーチン内の AND/OR 行は 7 から 8 桁目に指定することができます。

サブルーチンで使用するフィールドは、そのサブルーチン または残りのプロシージャーの中で定義することができます。 いずれの場合にも、フィールドはプロシージャーの本体とサブルーチンの両方 で使用することができます。

サブルーチンに別のサブルーチンを入れることはできません。 サブルーチンは別のサブルーチンを呼び出すことができます。 すなわち、サブルーチンには EXSR または CASxx を入れることができます。 しかし、サブルーチン内の EXSR または CASxx の指定で直接それ 自体を呼び出すことはできません。別のサブルーチンを介してそれ自体を間接的に呼び出すことも、 予測できない結果になる場合があるので、行ってはなりません。 同じサブルーチン内の別の場所に分岐したい場合には、 GOTO および TAG 命令コードを使用してください。

サブルーチンを、使用する順序に指定する必要はありません。 それぞれのサブルーチンは固有の記号名を持っていて、BEGSR および ENDSR ス テートメントを含んでいなければなりません。

サブルーチンの中では GOTO (分岐) 命令を使用することができます。GOTO で はそのサブルーチンに対応する ENDSR 命令のラベルは指定できますが、BEGSR 命令の名前を指定することはできません。 GOTO が TAG または ENDSR と同じサブルーチン内にある場合を除き、サブルー チン内の TAG または ENDSR に GOTO を出すことはできません。 LEAVESR 命令を使用すると、サブルーチン内の任意のポイントからそのサブルーチンを終了できます。制御は、そのサブルーチンの ENDSR 命令に渡されます。 LEAVESR はサブルーチン内からのみ使用できます。

メイン・プロシージャーのサブルーチン内の GOTO は、同じサブルーチン、明細演算、 または合計演算の中の TAG に出すことができます。 サブプロシージャーのサブ ルーチン内の GOTO は、同じサブルーチン内またはサブプロシージャーの本体 内の TAG に出すことができます。

サブルーチンのコーディングの例

図 163. サブルーチンのコーディング例
*...1....+....2....+....3....+....4....+....5....+....6....+....7...+....
CL0N01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....
 *
 * For a subroutine, positions 7 and 8 can be blank or contain SR.
 *
C                         :
C                         :
C                   EXSR      SUBRTB
C                         :
C                         :
C                         :
CL2                 EXSR      SUBRTA
C                         :
C                         :
C                         :
C     SUBRTA        BEGSR
C                         :
C                         :
C                         :
 *
 *  One subroutine can call another subroutine.
 *
C                   EXSR      SUBRTC
C                         :
C                         :
C                         :
C                   ENDSR
C     SUBRTB        BEGSR
C                         :
C                         :
C                         :
 *
*...1....+....2....+....3....+....4....+....5....+....6....+....7...+....
CL0N01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....
 *
 *  GOTO and TAG operations can be used within a subroutine.
 *
C     START         TAG
C                         :
C                         :
C                         :
C   23              GOTO      END
C                         :
C                         :
C                         :
C   24              GOTO      START
C     END           ENDSR
C     SUBRTC        BEGSR
C                         :
C                         :
C                         :
C                   ENDSR
 *