我想要做的是定义一个(AS400)ILE COBOL过程,该过程接受PIC X(n)参数,处理字符串,并将结果代码返回给调用程序。我担心的是:
1)无论我选择最大字符串大小的长度,某个程序可能需要用更大的字符串调用它,
2)尾随空格在结果方面可能有意义。
因此,该过程需要能够接受任意长度的参数,并在运行时确定字符串的实际长度是多少。
在阅读IBM文档时,我倾向于相信无法做到这一点。我是对的,还是实际上有办法实现这个目标?
答案 0 :(得分:2)
我不知道使用任意长度参数的任何问题(除了学习如何操作)。与每种语言一样,您需要定义可变长度字段或在第二个参数中接收实际长度。 PIC需要声明允许的最大长度。
可变长度参数将如下所示:
01 VL-FIELD.
05 i PIC S9(4) COMP-4.
05 data PIC X(n).
i 变量报告长度,PIC(n)将被编码为最大值。您无法安全地访问 i 所说的任何字节。
答案 1 :(得分:2)
您需要知道CALLed程序中字段的长度。所以我希望你在CALLing计划中知道它。所以,如果你知道那里的长度,你会没事的。
通常有两种方法可以继续:
使用长度(COBOL中VARCHAR的通用定义)作为数据前缀
将长度作为单独的参数传递
如果你不想仅仅为了给它添加前缀(如果它还没有),第二个可以更方便。
长度的字段类型?二进制会很好。哪个二进制?根据你的描述,它听起来像"原生二进制"最适合,而不是具有PICture大小的小数限制的二进制字段。那可能是COMP-4,但我还没有检查过你的COBOL。
如何为字段定义?
01 THE-DATA.
05 THE-LENGTH COMP-4 PIC S9(4).
05 THE-STRING.
10 FILLER OCCURS 0 TO 32767
DEPENDING ON THE-LENGTH.
15 FILLER PIC X.
或者
01 THE-LENGTH COMP-4 PIC S9(4).
01 THE-DATA.
05 THE-STRING.
10 FILLER OCCURS 0 TO 32767
DEPENDING ON THE-LENGTH.
15 FILLER PIC X.
在你的程序中,你只需使用THE-STRING,MOVE或DISPLAY等等。除了CALL之外的CALL,除了数据开头的地址之外没有传达任何内容,所以: - )
除非您需要,否则您不需要 CALLing计划中的定义。这是CALLed程序的一个方便的定义,虽然还有其他方法可以做到这一点,包括恶棍的避难所,参考修改: - )
如果能够使用NOSTDTRUNC进行编译,您将能够使用上述值,否则您至少需要定义更大的二进制字段,如PIC S9(6)。