gnucobol - GnuCOBOL 微不足道的“回声”功能
问题描述
如何为字符串处理创建 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
它在下面)。它编译时没有错误,因为您只引用了组项目,这是一个隐含的字母数字(-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。
推荐阅读
- sql - PROC SQL 条件插入使用 GT 和 LT
- c - 我应该如何验证从 argv 传入的整数值不会溢出?
- javascript - 如何在 Electron 的单个窗口中呈现多个 HTML 文件?
- algorithm - 如何在对角线上找到对称值的索引?
- xml - 基于不包含特定值的后代元素选择元素列表
- node.js - 使用 IAM 角色调用 AWS API Gateway
- groovy - 如何在for循环中使用字符串数组
- android - 在 Unity3D 中使用 AdMob 和受众网络 SDK 的多个 DEX 错误
- html - 如何使内联块容器的左右边距始终相等?
- javascript - 使用给定函数在 JS 中显示当前时间