2

在运行 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 个字符的字符串,它应该可以工作。

那么,我错过了什么吗?我应该如何声明变量,以便接收程序将其视为数字的字符串表示形式,而不是实际数字?

4

3 回答 3

2

您的样品有问题。

首先DCL &ENVPORT *CHAR(6)是无效的。

它应该是DCL &ENVPORT *CHAR 6或完全DCL VAR(&ENVPORT) TYPE(*CHAR) LEN(6)的。

第二个JCHKSTS被调用一次,常量值为'6500',再次调用'16500',您的解决方法是'6500 '没有一个长度为 6。

如果您设置了正确的字符串长度,它应该可以按预期工作。

于 2013-08-06T21:50:04.800 回答
2

作为文字传递的字符变量的默认长度是 32。我的猜测是 JCHKSTS 需要一个 32 字节的变量。尝试DCL &ENVPORT *CHAR 32

于 2013-08-06T22:09:35.210 回答
0

我以前没有见过这种类型的声明

DCL &ENVPORT *CHAR(6)

我习惯这样看:

DCL VAR(&ENVPORT) TYPE(*CHAR) LEN(6)

或者也许这样:

DCL &ENVPORT *CHAR LEN(6)

IBM 参考

于 2013-08-06T21:46:44.210 回答