デバッグ用サンプル・ソースの例

図 125 は、プログラム DEBUGEX のメイン・プロシージャーのソースを 示します。 この章に示されているほとんどの例および画面はこのソースに 基づいています。 図 126 および図 127 は、 呼び出されるプログラム RPGPGM とプロシージャー cproc をそれぞれに示します。

プログラム DEBUGEX は ILE ソース・デバッガーと ILE RPG 定様式ダンプの異なる側面を示すように設計されています。サンプルのダンプは次の章にあります。

次のステップは、プログラム DEBUGEX がこれら例で使用されるためにどのように 作成されたかを説明したものです。

  1. 図 125 のソースを使ってモジュール DBGEX を作るには、 次の入力をします。
    CRTRPGMOD MODULE(MYLIB/DBGEX) SRCFILE(MYLIB/QRPGLESRC) DBGVIEW(*ALL)
              TEXT('Main module for Sample Debug Program')

    使用可能な異なるビューを表示するために、DBGVIEW(*ALL) が選択され ました。

  2. 図 127 のソースを使用して C モジュールを作成するためには 、次を入力します。
    CRTCMOD MODULE(MYLIB/cproc) SRCFILE(MYLIB/QCLESRC) DBGVIEW(*SOURCE)
            TEXT('C procedure for Sample Debug Program')
  3. プログラム DEBUGEX を作成するためには、次を入力してください。
    CRTPGM PGM(MYLIB/DEBUGEX) MODULE(MYLIB/DBGEX MYLIB/CPROC)
               TEXT('Sample Debug Program')

    最初のモジュール DBGEX はこのプログラムの入力モジュールです。 このプログラムは、呼び出された時に新しい活動化グループ (すなわち *NEW) で実行されます。

  4. 図 126 のソースを使用して呼び出し先 RPG プログラムを 作成するためには、次を入力します。
    CRTBNDRPG PGM(MYLIB/RPGPGM) DFTACTGRP(*NO)
              DBGVIEW(*SOURCE) ACTGRP(*NEW)
              TEXT('RPG program for Sample Debug Program')

    作成した RPGPGM はデフォルトの OPM 活動化グループで実行することができます。 しかし、 これを DEBUGEX と同じ活動化グループで実行するよう 決定し、また DEBUGEX は一時活動化グループしか必要としないので 両方のプログラムに *NEW が選択されました。

図 125. モジュール DBGEX のソース
      *=================================================================*
      *  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
図 126. 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
図 127. C プロシージャー cproc のソース
     #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);
     }