我是ILE RPG的新手。今天,我开始根据自己的工作写书。在本章的其中一章中,介绍了一些使用子字符串函数%SUBSTR的示例。这是代码:

DMOD              S              5    INZ('VWXYZ')
DCON              S              5    INZ('abcde')
DLENGTH           S              5  0 INZ(2)
DSTART1           S              5  0 INZ(3)
DSTART2           S              5  0 INZ(4)
D*
C     mod           DSPLY
C     con           DSPLY
C     start1        DSPLY
C     start2        DSPLY
C     length        DSPLY
C*
C                   EVAL      %SUBST(mod:3:2) = con
C*
C                   EVAL      %SUBST(mod : 3 : 2) = %SUBST(con : 4 : 2)
C*
C                   EVAL      %SUBST(mod:start1:length) =
C                             %SUBST(con:start1:length)
C*
C                   EVAL      %SUBST(mod:start1-1:length) =
C                             %SUBST(con:start2/2:length+1)
C*
C                   MOVE      *ON           *INLR


编译时,执行异常,告诉我函数%SUBST中的参数错误。确切地说:第二个参数是错误的。我仅在最后一个EVAL中收到此错误。

最佳答案

您违反了RPG的precision rules ...

/运算符不是整数除法,它是数字,并且结果有小数位。

您需要显式控制表达式的结果类型:

DMOD              S              5    INZ('VWXYZ')
DCON              S              5    INZ('abcde')
DLENGTH           S              5  0 INZ(2)
DSTART1           S              5  0 INZ(3)
DSTART2           S              5  0 INZ(4)
D*
C     mod           DSPLY
C     con           DSPLY
C     start1        DSPLY
C     start2        DSPLY
C     length        DSPLY
C*
C                   EVAL      %SUBST(mod:3:2) = con
C*
C                   EVAL      %SUBST(mod : 3 : 2) = %SUBST(con : 4 : 2)
C*
C                   EVAL      %SUBST(mod:start1:length) =
C                             %SUBST(con:start1:length)
C*
C                   EVAL      %SUBST(mod:start1-1:length) =
C                             %SUBST(con:%int(start2 / 2):length+1)
C*
C                   MOVE      *ON           *INLR

关于ibm-midrange - ILE RPG程序无法编译,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39273504/

10-10 19:19