gpt4 book ai didi

cobol - CALL 参数(省略?文字?)

转载 作者:行者123 更新时间:2023-12-01 10:26:16 25 4
gpt4 key购买 nike

我有以下接受字符串、长度和“ bool ”参数的 COBOL 子例程。该子例程显示不带尾随空格的字符串。如果输入字符串的全长与子例程中用于字符串参数的存储不同,则会提供长度。 “ bool 值”表示显示字符串后是否应该前进一行。

   IDENTIFICATION DIVISION.
PROGRAM-ID. Display-String.

DATA DIVISION.
LOCAL-STORAGE SECTION.
01 i PIC 9(3).
01 Len PIC 9(3).

LINKAGE SECTION.
01 LS-Input-String PIC X(255).
01 LS-Input-Length PIC 9(3).
01 LS-Advancing PIC X.
88 LS-Advance VALUE 'T' WHEN SET TO FALSE 'F'.

PROCEDURE DIVISION USING LS-Input-String, LS-Input-Length,
LS-Advancing.
MOVE LENGTH OF LS-Input-String TO Len

IF ADDRESS OF LS-Input-Length NOT = NULL THEN
MOVE FUNCTION MIN(LS-Input-Length Len) TO Len
END-IF

PERFORM VARYING i FROM Len BY -1
UNTIL i LESS THAN 1 OR LS-Input-String(i:1) NOT = ' '
END-PERFORM

IF i > ZERO
IF LS-Advance THEN
DISPLAY LS-Input-String(1:i)
ELSE
DISPLAY LS-Input-String(1:i) WITH NO ADVANCING
END-IF
ELSE
IF LS-Advance THEN
DISPLAY ' '
END-IF
END-IF
GOBACK.

当我将其称为:
MOVE LENGTH OF WS-My-String TO WS-Length
CALL 'Display-String' USING WS-My-String, WS-Length, 'F'

但是我得到了错误的结果(子程序没有得到 10 而是空白什么的):
CALL 'Display-String' USING WS-My-String, 10, 'F'

所以它不接受第二个参数的文字,即使它可以很好地解释第三个参数文字。

我在编写这个子例程时提出的随机问题是:
  • CALL 中是否允许文字作为参数? ?我已经阅读了文档,但无法弄清楚。我还没有找到文字的例子,但没有相反的明确陈述。我怀疑通过 'F'从字面上看是错误的,但“碰巧起作用”。
  • 有没有更好的方法在这样的函数中处理各种长度的字符串?
  • 除了 DISPLAY ' ' 之外,还有更规范的方式向输出发出换行符吗? ,并且不显示空格?
  • 理想情况下,我希望能够省略一个参数并让默认值接管 CALL ,但是当我尝试执行以下操作时出现某种内存引用错误:CALL 'Display-String' USING OMITTED, 0, 'F' .我阅读了一些关于 OMITTED 的文档但不了解如何使其工作。

  • 我正在使用 cobc (OpenCOBOL) 1.1.0在 Linux 版本 3.9.10-100.fc17.i686.PAE (Fedora 17) 上。

    最佳答案

    一个 CALL语句具有三个 USING 选项:BY REFERENCE ; BY CONTENT ; BY VALUE ; OMITTED .好的,四个然后数最后一个。

    它们在指定时默认为 BY REFERENCE。指定的最新选项是指 CALL ... USING ... 上的以下项目,直到出现另一个选项。

    将这些应用到您编码的内容中,您所有的使用项目都是通过引用。

    是的,CALL 语句中允许使用文字。文字只能按内容或按值使用。所以你的电话应该是:

    CALL 'Display-String'          USING BY REFERENCE 
    WS-My-String
    BY CONTENT
    10
    BY CONTENT
    'F'

    或者:
    CALL 'Display-String'          USING BY REFERENCE 
    WS-My-String
    BY VALUE
    10
    BY VALUE
    'F'

    如果您使用 BY VALUE,您还必须在匹配的 PROCEDURE DIVISION USING ...(或 ENTRY ... USING ...)项目上指定 BY VALUE。

    然而,这并不是你的文字故事的结束,因为有一个错误。我建议您考虑升级到 GnuCOBOL(OpenCOBOL 的新名称)2.0。您可以在 SourceForge.Net 的 GnuCOBOL 讨论区找到有关此问题的讨论。它将被修复。如果您热衷于,您可以自己修复它并将其包含在源代码中......

    应该涵盖问题一和二。

    第三,有趣的问题。不是 COBOL 的规范方式,因为 COBOL 本身没有换行符等。 GnuCOBOL 领域的一个好问题。您可以 DISPLAY 适当值的十六进制文字,但这将无法传输。各种 COBOL 编译器在 DISPLAY 上有语言扩展。在没有数据要DISPLAY的情况下是否可以使用,我不知道。有一个 Z 字面量,它是一个由二进制零“终止”的字面量,但我认为字面量内容不会“丢失”。其他人会有意见和想法。

    第四,您应该能够在 CALL 上使用 OMITTED。您不能将 OMITTED 用于 BY VALUE 项目,但它可以用于 BY REFERENCE 和 BY CONTENT 项目。

    能够使用它也意味着能够在你的 CALLed 程序中处理它。如果你用字符串 OMITTED 调用你的程序,你的程序将失败,因为它假设那里有一个字段/值可以访问,但不会有。

    好的,一些评论。
    PROCEDURE DIVISION USING LS-Input-String, LS-Input-Length,
    LS-Advancing.

    代码中的逗号什么都不做。如果要突出分离性:
    PROCEDURE DIVISION            USING LS-Input-String
    LS-Input-Length
    LS-Advancing
    .

    如果有人离开 ,,不小心躺在那里,其他人可能会认为“它一定意味着什么”。
       MOVE LENGTH OF LS-Input-String TO Len

    IF ADDRESS OF LS-Input-Length NOT = NULL THEN
    MOVE FUNCTION MIN(LS-Input-Length Len) TO Len
    END-IF

    有两种方法可以获取标识符的长度: LENGTH OF ; FUNCTION LENGTH .后者允许这样做:
       IF ADDRESS OF LS-Input-Length NOT = NULL
    MOVE FUNCTION MIN (
    LS-Input-Length
    FUNCTION LENGTH (
    LS-Input-String
    )
    )
    TO Len
    END-IF

    然而:
       MOVE LENGTH OF LS-Input-String TO Len

    IF ADDRESS OF LS-Input-Length NOT = NULL THEN
    IF LS-Input-Length LESS THAN Len
    MOVE LS-Input-Length TO Len
    END-IF
    END-IF

    对我来说,如果你碰巧做了很多,会更清晰并且表现更好。

    我不会把东西塞在一起。在其他编译器上,您至少会从中获得一些诊断信息:
    LS-Input-String(i:1)

    我会做到的,类似的:
    LS-Input-String ( i : 1 )

    括号本身至少应该有空格。

    要检查完全空白,我...检查完全空白,但更早。在这种情况下保存循环,简化循环的终止条件:
       IF LS-Input-String EQUAL TO SPACE
    IF LS-Advance
    DISPLAY ' '
    END-IF
    ELSE
    PERFORM VARYING i FROM Len BY -1
    UNTIL LS-Input-String ( i : 1 )
    NOT EQUAL TO SPACE
    END-PERFORM
    IF LS-Advance THEN
    DISPLAY LS-Input-String ( 1 : i )
    ELSE
    DISPLAY LS-Input-String ( 1 : i )
    WITH NO ADVANCING
    END-IF
    END-IF

    我会把那些“腿”放到段落中并执行它们,但效果是一样的。
       GOBACK.

    GOBACK
    .

    在 PROCEDURE DIVISION 中,我只在标签或 SECTION 的末尾或在它们自己的一行上编码句号/句号。在移动代码或插入新代码时,您不必担心移动句号/句点。

    我也会做一些稍微不同的事情,这会产生更大的影响。

    按照您的编码方式,如果字符串的长度被省略,则调用程序必须提供 255 个字节的标识符。如果没有,那么您的 CALLed 程序将拾取不应该的东西。

    如果那是您的意图,那么好的。如果不是,我会考虑不将长度设为可选,并使用实际字段的长度,使用 OCCURS DEPENDING ON .
    01  LS-Input-String.
    05 FILLER OCCURS 0 TO 255 TIMES
    DEPENDING ON LS-Input-Length.
    10 FILLER PIC X.
    01 LS-Input-Length PIC 9(3).

    ...

    MOVE LS-Input-Length TO Len

    现在,当你有一个零长度输入时,
               DISPLAY LS-Input-String

    做的更像你想要的。一个新行,但在旧行上甚至没有空格。

    关于cobol - CALL 参数(省略?文字?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28651004/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com