基底付き変数の評価

変数がポインターに基づく場合、その変数は通常の EVAL コマンドを使用したデバッガーによる評価に使用不可である場合があります。基底付きポインター自身が基底付きである場合、または基底付きポインターが参照で渡される入力パラメーターである場合 (CONST キーワードを使用した読み取り専用参照を含む)、これが発生することがあります。

例えば、以下のプログラムで、"basedFld" は、入力パラメーターであるポインター "parmPtr" に基づいています。

 /copy myPgmProto
D myPgm           pi
D   parmPtr                       *
D basedFld        s              5a   based(parmPtr)

デバッガーで "basedFld" を評価するには、以下のメソッドのいずれかを使用します。

  1. ポインターがアドレス指定するデータの表示に説明されている :c または :x 表記を使用して基底付きポインターを評価します。例えば、次のとおりです。
             ===> eval parmPtr:c
             ===> eval parmPtr:x
    : このメソッドは、パック、整数、または UCS-2 データなどの自然な表示と似ていない 16 進数表示を持つデータで正しく機能しません。
  2. 基底付きポインターを明示的に指定するには、デバッガーの "矢印" 表記を使用します。このメソッドは、変数を変更するためにも使用できます。
             
    ===> eval parmPtr->basedFld
             ===> eval parmPtr->basedFld = 'abcde'

変数が 3 レベル以上の基底付き変数を持っている場合、2 番目のメソッドを使用する必要があります。例えば、以下のプログラムで、変数 "basedVal" は、3 レベルの基底付きポインターを持っています。 これは、ポインター "p1" に基づいており、"p1" はポインター "p2" に基づいており、"p2" はさらにポインター "p3" に基づいています。変数 "basedVal" は、単純に "EVAL basedVal" を使用してデバッガーで評価することはできません。

D storage         s              5a   inz('abcde')
D val             s              5a
D basedVal        s              5a   based(p1)
D p1              s               *   based(p2)
D p2              s               *   based(p3)
D p3              s               *
D ptr1            s               *   inz(%addr(storage))
D ptr2            s               *   inz(%addr(ptr1))
D ptr3            s               *   inz(%addr(ptr2))
C                   eval      p3 = ptr3
C                   eval      p2 = ptr2
C                   eval      p1 = ptr1
C                   eval      val = basedVal

"basedVal" などの変数を表示するには、デバッガーの p1->p2->name 表記を使用して、基底付きポインターを明示的に指定します。この表記を使用するには、表示する変数を指定してから、左に向かって作業し、 基底付きポインター名と矢印 (->) を指定します。基底付きポインター自身が基底付きである場合は、2 番目の基底付きポインターと矢印を、以前の基底付きポインターの左に指定します。

例えば、basedVal を評価するには、以下のようにします。

     ===> EVAL p3->p2->p1->basedVal
                           aaaaaaaa
                       bbbb
                   cccc             
               dddd
     a. variable name
     b. basing pointer of variable ->
     c. basing pointer of basing pointer ->
     d. and so on