Ibm midrange CL CALL语句中传递的参数的类型

Ibm midrange CL CALL语句中传递的参数的类型,ibm-midrange,control-language,Ibm Midrange,Control Language,在运行i/OS6.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' '165

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


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

我以前从未见过这种类型的声明

DCL &ENVPORT *CHAR(6)
我习惯这样看:

DCL VAR(&ENVPORT) TYPE(*CHAR) LEN(6)
DCL &ENVPORT *CHAR LEN(6)
或者这样:

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

我以前从未见过这种类型的声明

DCL &ENVPORT *CHAR(6)
我习惯这样看:

DCL VAR(&ENVPORT) TYPE(*CHAR) LEN(6)
DCL &ENVPORT *CHAR LEN(6)
或者这样:

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

你的样品有点不对劲

第一个DCL&ENVPORT*CHAR6无效

它应该是DCL&ENVPORT*CHAR 6或完全DCL VAR&ENVPORT TYPE*CHAR LEN6

第二个JCHKSTS调用一次,常量值为“6500”,再次调用“16500”,您的解决方案为“6500”,其中没有一个长度为6


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

您的示例有点不正确

第一个DCL&ENVPORT*CHAR6无效

它应该是DCL&ENVPORT*CHAR 6或完全DCL VAR&ENVPORT TYPE*CHAR LEN6

第二个JCHKSTS调用一次,常量值为“6500”,再次调用“16500”,您的解决方案为“6500”,其中没有一个长度为6


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

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

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

对不起,我不知道这些位可能相关:声明的确切格式是DCL&ENVPORT*CHAR 6,编译器似乎很喜欢它,将6放入长度参数中;我一开始声明它的长度为5,值为“6500”或“16500”,但为了增加额外的空间,我将代码修改为DCL&ENVPORT*CHAR LEN5和CHGVAR VAR&ENVPORT值为“16500”,JCHKSTS仍然没有收到“16500”作为其输入…抱歉,我不知道这些位可能是相关的:声明的确切格式是DCL&ENVPORT*CHAR 6,编译器似乎很喜欢它,对其进行F4ing将6放入长度参数中;我开始声明它的长度为5,值为“6500”或“16500”,但为了增加额外的空间,我将代码修改为DCL&ENVPORT*CHAR LEN5和CHGVAR VAR&ENVPORT值为“16500”,JCHKSTS仍然没有接收到“16500”作为输入……噢!我记得看到文档中提到的默认长度,根本没有考虑它。问题解决了。谢谢哦!我记得看到文档中提到的默认长度,根本没有考虑它。问题解决了。谢谢