GnuCOBOL 普通 "echo" 函数
GnuCOBOL trivial "echo" function
如何创建 X ANY LENGTH 函数来处理字符串?微不足道(用其他语言)"echo-reply" 做了一些意想不到的事情。文档、开放资源和常见问题解答 https://open-cobol.sourceforge.io/faq/index.html#id362 没有帮助。
IDENTIFICATION DIVISION.
PROGRAM-ID. stdtest.
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
REPOSITORY.
FUNCTION ALL INTRINSIC
FUNCTION REPLY.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 tst BINARY-SHORT UNSIGNED.
01 expected PIC S9(6)V9(4) USAGE COMP.
01 argA PIC S9(6)V9(4) USAGE COMP.
01 argB PIC S9(6)V9(4) USAGE COMP.
PROCEDURE DIVISION.
*> must print whole string instead of first 8 chars
DISPLAY FUNCTION REPLY("The quick brown fox jumps over the lazy dog").
STOP RUN.
END PROGRAM stdtest.
IDENTIFICATION DIVISION.
FUNCTION-ID. REPLY.
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
REPOSITORY.
FUNCTION ALL INTRINSIC.
DATA DIVISION.
LINKAGE SECTION.
01 argument PIC X ANY LENGTH.
01 result.
05 argument-pointer USAGE POINTER.
PROCEDURE DIVISION USING BY REFERENCE argument RETURNING result.
*> https://open-cobol.sourceforge.io/faq/index.html#id362
MOVE argument TO result.
END FUNCTION REPLY.
你的示例结果为 8 个字符,因为返回组(在你的机器上)是 8 个字节长(因为它下面的 POINTER
)。它编译没有错误,因为您只引用组项目,这是一个隐含的字母数字(-组)项目(或国家组项目,如果您添加 USAGE NATIONAL
)
使用(最近的)"standard" COBOL 的方法是可变长度 RETURNING
项。
标准为函数提供的选项是 DYNAMIC LENGTH
(理想版本,但 GnuCOBOL 尚不支持)或足以容纳数据的可变长度组 (OCCURS 0 TO ... DEPENDING ON
)。
以下示例 应该 工作(但会导致内部 [codegen] 错误,该错误应在即将发布的 3.1rc1 中修复):
IDENTIFICATION DIVISION.
FUNCTION-ID. REPLY.
DATA DIVISION.
WORKING-STORAGE SECTION.
77 arg-len USAGE BINARY-LONG.
LINKAGE SECTION.
01 argument PIC X ANY LENGTH.
01 result.
05 filler PIC X OCCURS 0 to 99999 DEPENDING ON arg-len.
PROCEDURE DIVISION USING BY REFERENCE argument RETURNING result.
MOVE FUNCTION LENGTH (argument) TO arg-len
MOVE argument TO result.
END FUNCTION REPLY.
注意:您在 GnuCOBOL 问题跟踪器中找到错误报告和潜在修复的补丁 #641。
如何创建 X ANY LENGTH 函数来处理字符串?微不足道(用其他语言)"echo-reply" 做了一些意想不到的事情。文档、开放资源和常见问题解答 https://open-cobol.sourceforge.io/faq/index.html#id362 没有帮助。
IDENTIFICATION DIVISION.
PROGRAM-ID. stdtest.
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
REPOSITORY.
FUNCTION ALL INTRINSIC
FUNCTION REPLY.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 tst BINARY-SHORT UNSIGNED.
01 expected PIC S9(6)V9(4) USAGE COMP.
01 argA PIC S9(6)V9(4) USAGE COMP.
01 argB PIC S9(6)V9(4) USAGE COMP.
PROCEDURE DIVISION.
*> must print whole string instead of first 8 chars
DISPLAY FUNCTION REPLY("The quick brown fox jumps over the lazy dog").
STOP RUN.
END PROGRAM stdtest.
IDENTIFICATION DIVISION.
FUNCTION-ID. REPLY.
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
REPOSITORY.
FUNCTION ALL INTRINSIC.
DATA DIVISION.
LINKAGE SECTION.
01 argument PIC X ANY LENGTH.
01 result.
05 argument-pointer USAGE POINTER.
PROCEDURE DIVISION USING BY REFERENCE argument RETURNING result.
*> https://open-cobol.sourceforge.io/faq/index.html#id362
MOVE argument TO result.
END FUNCTION REPLY.
你的示例结果为 8 个字符,因为返回组(在你的机器上)是 8 个字节长(因为它下面的 POINTER
)。它编译没有错误,因为您只引用组项目,这是一个隐含的字母数字(-组)项目(或国家组项目,如果您添加 USAGE NATIONAL
)
使用(最近的)"standard" COBOL 的方法是可变长度 RETURNING
项。
标准为函数提供的选项是 DYNAMIC LENGTH
(理想版本,但 GnuCOBOL 尚不支持)或足以容纳数据的可变长度组 (OCCURS 0 TO ... DEPENDING ON
)。
以下示例 应该 工作(但会导致内部 [codegen] 错误,该错误应在即将发布的 3.1rc1 中修复):
IDENTIFICATION DIVISION.
FUNCTION-ID. REPLY.
DATA DIVISION.
WORKING-STORAGE SECTION.
77 arg-len USAGE BINARY-LONG.
LINKAGE SECTION.
01 argument PIC X ANY LENGTH.
01 result.
05 filler PIC X OCCURS 0 to 99999 DEPENDING ON arg-len.
PROCEDURE DIVISION USING BY REFERENCE argument RETURNING result.
MOVE FUNCTION LENGTH (argument) TO arg-len
MOVE argument TO result.
END FUNCTION REPLY.
注意:您在 GnuCOBOL 问题跟踪器中找到错误报告和潜在修复的补丁 #641。