%ELEM(获取元素数目)

%ELEM(table_name)
%ELEM(array_name)
%ELEM(multiple_occurrence_data_structure_name)
%ELEM(array_name:*ALLOC)
%ELEM(array_name:*KEEP)
%ELEM(array_name:*MAX)

%ELEM 返回指定数组,表或多次出现的数据结构中的元素数。 返回的值为无符号整数格式 (类型 U)。 可以在定义规范或扩展因子 2 字段中的表达式中的任何位置指定数字常量。

参数必须是数组,表或多次出现数据结构的名称。

当数组具有可变维 (使用 DIM (*AUTO) 或 DIM (*VAR) 定义数组) 时,可以通过多种其他方式使用 %ELEM。
  • %ELEM 可用作赋值语句的目标,以更改可变维数组的当前元素数。
  • 当 %ELEM 用于其值时,可以为 %ELEM 指定第二个参数。
    *ALLOC
    将返回分配给数组的元素数。
    *MAX
    返回数组的最大元素数。
  • 当 %ELEM 是赋值语句的目标时,可以为 %ELEM 指定第二个参数。
    *ALLOC
    如果赋值语句右侧的值大于数组的当前元素数,那么将增大分配给数组的元素数。 如果该值小于当前元素数,那么不会更改元素数。 分配给数组的元素数可能大于指定的值。 未更改当前元素数。
    *KEEP
    不会更改数组中任何新元素的值。
请参阅 变量维数组 (Varying-dimension array)
如果参数是复杂限定名,并且包含必需子字段的数据结构是数组,那么可以通过以下两种方法之一来指定参数:
  • 使用为复杂限定名中的所有数据结构数组指定的索引。
  • 在复杂限定名中没有为任何数据结构数组指定索引。
请参阅 具有复杂数据结构的 %ELEM 示例

有关更多信息,请参阅 数组操作内置函数

图 1。 %ELEM 示例
 *..1....+....2....+....3....+....4....+....5....+....6....+....7...+....
D*Name++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++
D arr1d           S             20    DIM(10)
D table           S             10    DIM(20) ctdata
D mds             DS            20    occurs(30)
D num             S              5p 0

 * like_array will be defined with a dimension of 10.
 * array_dims will be defined with a value of 10.
D like_array      S                   like(arr1d) dim(%elem(arr1d))
D array_dims      C                   const (%elem (arr1d))

 /FREE
    num = %elem (arr1d);  // num is now 10
    num = %elem (table);  // num is now 20
    num = %elem (mds);    // num is now 30
 /END-FREE

具有复杂数据结构的 %ELEM 示例

在以下示例中,引用复杂限定子字段 PET 的标准方法是

family(x).child(y).pet

当指定为 %ELEM 的参数时,可以在没有为数据结构数组指定任何索引 (如语句 1 中所示) 或为数据结构数组指定所有索引 (如语句 2 中所示) 的情况下指定该参数。


   DCL-DS family QUALIFIED DIM(3);
      name VARCHAR(25);
      numChildren INT(10);
      DCL-DS child DIM(10);
         name VARCHAR(25);
         numPets INT(10);
         pet VARCHAR(100) DIM(3);
      END-DS;
   END-DS;
   DCL-S x INT(10);

   x = %ELEM(family.child.pet);        //  1 

   x = %ELEM(family(1).child(1).pet);  //  2