在运行 i/OS 6.1 的 iSeries 上,我有一个正在清理的 CL 程序。在这个程序中有一堆剪切和粘贴形式的代码:
IF COND(&ENV='PRD') THEN(DO)
CALL JCHKSTS PARM(&RS '127.0.0.1' '6500')
/* more junk here */
ENDDO
IF COND(&ENV='TST') THEN(DO)
CALL JCHKSTS PARM(&RS '127.0.0.1' '16500')
/* more junk here, same as in the first block */
ENDDO
/* repeat for several more &ENV values */
自然,当我看到这个时,我的第一个想法是,让我们将该端口号移动到一个变量中并消除所有重复的代码块,所以我最终得到:
DCL &ENVPORT *CHAR(6)
IF COND(&ENV='PRD') THEN(CHGVAR VAR(&ENVPORT) VALUE('6500'))
IF COND(&ENV='TST') THEN(CHGVAR VAR(&ENVPORT) VALUE('16500'))
CALL JCHKSTS PARM(&RS '127.0.0.1' &ENVPORT)
/* more junk here, but only one copy of it now. */
当我运行此代码时,它失败了,因为事实证明 JCHKSTS 程序需要一个字符串作为其第三个参数(它在内部转换为整数)和 &ENVPORT 变量,尽管它被声明为字符串并用字符串初始化值,显然没有作为字符串传递。(从 JCHKSTS 中检查参数显示端口值的值为 MAXINT。)
我通过将值从 更改为 的廉价权宜之计解决了这个问题'6500'
,'6500 '
但我不明白为什么它一开始就不能正常工作;IBM 文档说:
如果从 CL 程序或 ILE CL 过程进行调用,则可以传递程序变量,在这种情况下,接收程序必须声明该字段以匹配调用 CL 程序或 ILE CL 过程中定义的变量。
这对我来说肯定是,接收程序需要一个字符串,我将变量声明为 6 个字符的字符串,它应该可以工作。
那么,我错过了什么吗?我应该如何声明变量,以便接收程序将其视为数字的字符串表示形式,而不是实际数字?