首页 > 解决方案 > GnuCOBOL 微不足道的“回声”功能

问题描述

如何为字符串处理创建 X ANY LENGTH 函数?琐碎的(在其他语言中)“echo-r​​eply”做了一些意想不到的事情。文档、开放资源和常见问题解答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.

标签: gnucobol

解决方案


您的示例结果为 8 个字符,因为返回组(在您的机器上)长 8 个字节(因为POINTER它在下面)。它编译时没有错误,因为您只引用了组项目,这是一个隐含的字母数字(-group)-item(或 national-group-item,如果您添加USAGE NATIONAL

使用(最近的)“标准”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


推荐阅读