デバッグ用サンプル・ソースの例
図 1 は、プログラム DEBUGEX のメイン・プロシージャーのソースを 示します。 この章に示されているほとんどの例および画面はこのソースに 基づいています。 図 2 および図 3 は、 呼び出されるプログラム RPGPGM とプロシージャー cproc をそれぞれに示します。
プログラム DEBUGEX は ILE ソース・デバッガーと ILE RPG 定様式ダンプの異なる側面を示すように設計されています。サンプルのダンプは次の章にあります。
次のステップは、プログラム DEBUGEX がこれら例で使用されるためにどのように
作成されたかを説明したものです。
- 図 1 のソースを使ってモジュール DBGEX を作るには、
次の入力をします。
CRTRPGMOD MODULE(MYLIB/DBGEX) SRCFILE(MYLIB/QRPGLESRC) DBGVIEW(*ALL) TEXT('Main module for Sample Debug Program')使用可能な異なるビューを表示するために、DBGVIEW(*ALL) が選択され ました。
- 図 3 のソースを使用して C モジュールを作成するためには
、次を入力します。
CRTCMOD MODULE(MYLIB/cproc) SRCFILE(MYLIB/QCLESRC) DBGVIEW(*SOURCE) TEXT('C procedure for Sample Debug Program') - プログラム DEBUGEX を作成するためには、次を入力してください。
CRTPGM PGM(MYLIB/DEBUGEX) MODULE(MYLIB/DBGEX MYLIB/CPROC) TEXT('Sample Debug Program')最初のモジュール DBGEX はこのプログラムの入力モジュールです。 このプログラムは、呼び出された時に新しい活動化グループ (すなわち *NEW) で実行されます。
- 図 2 のソースを使用して呼び出し先 RPG プログラムを
作成するためには、次を入力します。
CRTBNDRPG PGM(MYLIB/RPGPGM) DFTACTGRP(*NO) DBGVIEW(*SOURCE) ACTGRP(*NEW) TEXT('RPG program for Sample Debug Program')作成した RPGPGM はデフォルトの OPM 活動化グループで実行することができます。 しかし、 これを DEBUGEX と同じ活動化グループで実行するよう 決定し、また DEBUGEX は一時活動化グループしか必要としないので 両方のプログラムに *NEW が選択されました。
図 1. モジュール DBGEX のソース. DBGEX はプログラム DEBUGEX のメイン・モジュールです。
*=================================================================*
* 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
図 2. OPM プログラム RPGPGM のソース
*=================================================================*
* RPGPGM - ILE ソース・デバッガーの STEP 機能を説明するための、 *
* DEBUGEX によって呼び出されるプログラム。 *
* *
* このプログラムは DEBUGEX からパラメーター InputParm を *
* 受け取り、表示してから戻ります。 *
*=================================================================*
D InputParm S 4P 3
C *ENTRY PLIST
C PARM InputParm
C InputParm DSPLY
C SETON LR
図 3. C プロシージャー cproc のソース. cproc は DBGEX によって呼び出されます。
#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);
}