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