Ibm midrange 在CL程序中是否可以将十六进制格式字符转换回十进制?

Ibm midrange 在CL程序中是否可以将十六进制格式字符转换回十进制?,ibm-midrange,control-language,Ibm Midrange,Control Language,我有一个RPG程序a和一个CL程序B。a用数据结构作为输入参数调用B。此数据结构包含字符和压缩小数。B中的entry参数声明为字符变量,因此当从a传入entry参数时,十进制值以十六进制格式结束。我需要它们在B中的原始十进制值。有没有办法将这些十六进制字符串转换回B中的十进制?您不需要转换。在数据结构中的适当位置定义十进制字段 PGM (&STRUCT) DCL &STRUCT *CHAR 12 DCL &NAME *CHAR 10

我有一个RPG程序a和一个CL程序B。a用数据结构作为输入参数调用B。此数据结构包含字符和压缩小数。B中的entry参数声明为字符变量,因此当从a传入entry参数时,十进制值以十六进制格式结束。我需要它们在B中的原始十进制值。有没有办法将这些十六进制字符串转换回B中的十进制?

您不需要转换。在数据结构中的适当位置定义十进制字段

PGM (&STRUCT)
   DCL &STRUCT      *CHAR 12
   DCL &NAME        *CHAR 10   STG(*DEFINED) DEFVAR(&STRUCT)
   DCL &NBR         *DEC (3 0) STG(*DEFINED) DEFVAR(&STRUCT 11)
*定义的存储方法在位置固定时运行良好。在位置可能不同的情况下,请使用基于*的存储

在本例中,在由格式参数确定的位置上有一个数值。该值将增加1或2

PGM (&STRUCT)
   DCL &STRUCT     *CHAR 80
   DCL &FMT        *CHAR 4
   DCL &P1         *PTR
   DCL &NUM        *DEC (3 0) STG(*BASED)
   ...
   CHGVAR &FMT %SUBSTR(&STRUCT 1 4)
   CHGVAR  &P1  %ADDRESS(&STRUCT)
   SELECT
      WHEN (&FMT = 'ONE ')  THEN(DO)
         CHGVAR %OFFSET(&P1) 20       /* POS 21 IN STRUCT */
         CHGVAR &NUM (&NUM + 1)       /* INCREMENT NUMBER BY 1 */
         ENDDO
      WHEN  (&FMT = 'TWO ')  THEN(DO)
         CHGVAR %OFFSET(&P1) 40       /* POS 41 IN STRUCT */
         CHGVAR &NUM (&NUM + 2)       /* INCREMENT NUMBER BY 2 */
         ENDDO
      OTHERWISE DO
         /* EXIT WITH ERROR */
         ...
         ENDDO
      ENDSELECT

请参见

侧注:这不是十六进制格式,因为低阶半字节(又称半字节)表示符号而不是数字。假设有另一个RPG程序C也调用B,但传递不同的数据结构作为参数。如果两者都在B中声明,是否会引起任何问题?根据调用程序的不同,十进制值可能会被分配一个非十进制值。我不确定这是否有效。是的,如果几乎所有被调用的程序都无法确定其输入数据的格式,从而无法确定如何正确处理它,那么这肯定是一个问题。通常,您会发现它是用某种识别输入格式的方法设计的。正如我上面所说的,如果十进制值的位置是可变的,那么基于数据的存储通常是最佳选择。如果不使用DCL,是否不可能做到这一点?但这并不是一个非常灵活的选择。实际上,基于存储的概念是非常动态的,只需设置指针的地址,就可以将变量定义覆盖在变量内存的任何部分上。您需要更多的灵活性吗?为什么?正如我前面所描述的,可能有多个程序调用B,并且它们可能会传递不同的数据结构作为入口参数。因此,如果由于传入的数据结构不同而将其映射到错误的内存类型,会有任何问题吗?