図 125 は、プログラム DEBUGEX のメイン・プロシージャーのソースを 示します。 この章に示されているほとんどの例および画面はこのソースに 基づいています。 図 126 および図 127 は、 呼び出されるプログラム RPGPGM とプロシージャー cproc をそれぞれに示します。
プログラム DEBUGEX は ILE ソース・デバッガーと ILE RPG 定様式ダンプの異なる側面を示すように設計されています。サンプルのダンプは次の章にあります。
次のステップは、プログラム DEBUGEX がこれら例で使用されるためにどのように 作成されたかを説明したものです。
CRTRPGMOD MODULE(MYLIB/DBGEX) SRCFILE(MYLIB/QRPGLESRC) DBGVIEW(*ALL) TEXT('Main module for Sample Debug Program')
使用可能な異なるビューを表示するために、DBGVIEW(*ALL) が選択され ました。
CRTCMOD MODULE(MYLIB/cproc) SRCFILE(MYLIB/QCLESRC) DBGVIEW(*SOURCE) TEXT('C procedure for Sample Debug Program')
CRTPGM PGM(MYLIB/DEBUGEX) MODULE(MYLIB/DBGEX MYLIB/CPROC) TEXT('Sample Debug Program')
最初のモジュール DBGEX はこのプログラムの入力モジュールです。 このプログラムは、呼び出された時に新しい活動化グループ (すなわち *NEW) で実行されます。
CRTBNDRPG PGM(MYLIB/RPGPGM) DFTACTGRP(*NO) DBGVIEW(*SOURCE) ACTGRP(*NEW) TEXT('RPG program for Sample Debug Program')
作成した RPGPGM はデフォルトの OPM 活動化グループで実行することができます。 しかし、 これを DEBUGEX と同じ活動化グループで実行するよう 決定し、また DEBUGEX は一時活動化グループしか必要としないので 両方のプログラムに *NEW が選択されました。
*=================================================================* * DEBUGEX - ILE RPG ソースでの ILE ソース・デバッグ・ * プログラムの使用法を示すように設計されたプログラム。 * 各種のデータ・タイプおよびデータ構造の例を示します。 * * また、定様式ダンプ例の作成にも使用できます。 *=================================================================* *-----------------------------------------------------------------* * DEBUG キーワードは定様式ダンプ機能を可能にします。 *-----------------------------------------------------------------* H DEBUG *-----------------------------------------------------------------* * 各種の ILE RPG データ・タイプの独立フィールドの定義 *-----------------------------------------------------------------* D String S 6A INZ('ABCDEF') D Packed1D0 S 5P 2 INZ(-93.4) D ZonedD3D2 S 3S 2 INZ(-3.21) D Bin4D3 S 4B 3 INZ(-4.321) D Bin9D7 S 9B 7 INZ(98.7654321) D DBCSString S 3G INZ(G'"BBCCDD"') D UCS2String S 5C INZ(%UCS2('ucs-2')) D CharVarying S 5A INZ('abc') VARYING D Int3 S 3I 0 INZ(-128) D Int5 S 5I 0 INZ(-2046) D Int10 S 10I 0 INZ(-31904) D Int20 S 20I 0 INZ(-463972) D Unsigned3 S 3U 0 INZ(128) D Unsigned5 S 5U 0 INZ(2046) D Unsigned10 S 10U 0 INZ(31904) D Unsigned20 S 20U 0 INZ(463972) D Float4 S 4f INZ(7.2098) D Float8 S 8f INZ(-129.0978652) D DBCSString S 3G INZ(G'"BBCCDD"')
* ポインター D NullPtr S * INZ(*NULL) D BasePtr S * INZ(%ADDR(String)) D ProcPtr S * ProcPtr INZ(%PADDR('c_proc')) D BaseString S 6A BASED(BasePtr) D BaseOnNull S 10A BASED(NullPtr) * D Spcptr S * D SpcSiz C 8 * 日付、時刻、タイム・スタンプ D BigDate S D INZ(D'9999-12-31') D BigTime S T INZ(T'12.00.00') D BigTstamp S Z INZ(Z'9999-12-31-12.00.00.000000') * Array D Arry S 3S 2 DIM(2) INZ(1.23) * Table D TableA S 3 DIM(3) CTDATA *-----------------------------------------------------------------* * 各種のデータ構造の定義 *-----------------------------------------------------------------* D DS1 DS OCCURS(3) D Fld1 5A INZ('ABCDE') D Fld1a 1A DIM(5) OVERLAY(Fld1) D Fld2 5B 2 INZ(123.45) * D DS2 DS 10 OCCURS(2) * D DS3 DS D Title 5A INZ('Mr. ') D LastName 10A INZ('Jones ') D FirstName 10A INZ('Fred ') D QUALDS DS QUALIFIED D Id_Num 8S 0 D Country 20A DIM(10) D LIKE_QUALDS DS LIKEDS(QUALDS) D itemInfo DS QUALIFIED D ID_Num 10I 0 D name 25A D items DS QUALIFIED D numItems 10I 0 D item LIKEDS(itemInfo) DIM(10) D cust DS QUALIFIED DIM(10) D name 50A D parts LIKEDS(items) *-----------------------------------------------------------------* * 呼び出されるプロシージャー c_proc および switch のプロトタイプの定義 *-----------------------------------------------------------------* D c_proc PR * EXTPROC('c_proc') D size 10U 0 VALUE D inzval 1A CONST D Switch PR D Parm 1A *-----------------------------------------------------------------* * 非プロトタイプ呼び出しの場合のパラメーターの定義。 * PARM1 は RPGPROG プログラムの呼び出し時に使用されます。 *-----------------------------------------------------------------* D PARM1 S 4P 3 INZ(6.666) D EXPORTFLD S 6A INZ('export') EXPORT
*=================================================================* * 値の変更または他のオブジェクトの呼び出しのための命令。 *=================================================================* *-----------------------------------------------------------------* * 'a' をデータ構造 DS2 に転送します。転送後、 * DS2 の最初のオカレンスには 10 桁の 'a' が入っています。 *-----------------------------------------------------------------* C MOVE *ALL'a' DS2 *-----------------------------------------------------------------* * DS2 のオカレンスを 2 に変更して、'b' を DS2 に転送すると、 * 最初の 10 バイトは 'a' で 2 番目の 10 バイトが 'b' になります。 *-----------------------------------------------------------------* C 2 OCCUR DS2 C MOVE *ALL'b' DS2 *-----------------------------------------------------------------* * Fld1a は Fld1 のオーバーレイ・フィールドです。Fld1 は * 'ABCDE' に初期化されているので、Fld1a(1) の値は 'A' です。 * 次の MOVE 命令の後の Fld1a(1) の値は '1' になります。 *-----------------------------------------------------------------* C MOVE '1' Fld1a(1) *-----------------------------------------------------------------* * 別のプログラム・オブジェクトであるプログラム RPGPGM を呼び出します。 *-----------------------------------------------------------------* C Plist1 PLIST C PARM Parm1 C CALL 'RPGPGM' Plist1 *-----------------------------------------------------------------* * メイン・プロシージャーから ExportFld をインポートする * c_proc を呼び出します。 *-----------------------------------------------------------------* C EVAL SpcPtr = c_proc(SpcSiz : 'P') *-----------------------------------------------------------------* * 標識の値を反転する、ローカル・サブプロシージャー Switch を * 呼び出します。 *-----------------------------------------------------------------* C EVAL *IN10 = '0' C CALLP Switch(*in10)
*-----------------------------------------------------------------* * 次の SETON 命令の後、*IN02 = 1 になります。 *-----------------------------------------------------------------* C SETON 020406 C IF *IN02 = '1' C MOVE '1994-09-30' BigDate C ENDIF *-----------------------------------------------------------------* * Arry の 2 番目のセルに新しい値を入れます。 *-----------------------------------------------------------------* C MOVE 4 Arry *-----------------------------------------------------------------* * ここで定様式ダンプを開始し、LR をオンに設定して戻ります。 *-----------------------------------------------------------------* C DUMP C SETON LR *=================================================================* * サブプロシージャー Switch を定義します。 *=================================================================* P Switch B D Switch PI D Parm 1A *-----------------------------------------------------------------* * デバッグ目的のローカル変数を定義します。 *-----------------------------------------------------------------* D Local S 5A INZ('aaaaa') C IF Parm = '1' C EVAL Parm = '0' C ELSE C EVAL Parm = '1' C ENDIF P Switch E *=================================================================* * テーブルのコンパイル時データ・セクション *=================================================================* ** aaa bbb ccc
*=================================================================* * RPGPGM - ILE ソース・デバッガーの STEP 機能を説明するための、 * * DEBUGEX によって呼び出されるプログラム。 * * * * このプログラムは DEBUGEX からパラメーター InputParm を * * 受け取り、表示してから戻ります。 * *=================================================================* D InputParm S 4P 3 C *ENTRY PLIST C PARM InputParm C InputParm DSPLY C SETON LR
#include <stdlib.h> #include <string.h> #include <stdio.h> extern char EXPORTFLD[6]; char *c_proc(unsigned int size, char *inzval) { char *ptr; ptr = malloc(size); memset(ptr, *inzval, size); printf("import string: %6s.¥n",EXPORTFLD); return(ptr); }
(C) Copyright IBM Corporation 1992, 2006. All Rights Reserved.