Cobol 调用参数(省略?文字?)

Cobol 调用参数(省略?文字?),cobol,Cobol,我有下面的COBOL子例程,它接受一个字符串、一个长度和一个“布尔”参数。子例程显示不带尾随空格的字符串。如果输入字符串的完整长度与字符串参数的子例程中使用的存储不同,则会提供长度。“布尔值”表示显示字符串后是否应提前一行 IDENTIFICATION DIVISION. PROGRAM-ID. Display-String. DATA DIVISION. LOCAL-STORAGE SECTION. 01 i PIC 9(3

我有下面的COBOL子例程,它接受一个字符串、一个长度和一个“布尔”参数。子例程显示不带尾随空格的字符串。如果输入字符串的完整长度与字符串参数的子例程中使用的存储不同,则会提供长度。“布尔值”表示显示字符串后是否应提前一行

   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
,而是空白或其他内容):

所以它不接受第二个参数的文本,即使它解释了第三个参数的文本

我在编写此子程序时遇到的随机问题是:

  • 调用中是否允许将文本作为参数?我已经通读了文档,但很难弄清楚。我没有找到文字的例子,但是没有明确的相反的陈述。我怀疑传递
    'F'
    从字面上看是错误的,但“碰巧有用”

  • 在这样的函数中,有没有更好的方法来处理不同长度的字符串

  • 除了
    显示“”
    ,还有没有更规范的方式向输出发出换行符而不显示空格

  • 理想情况下,我希望能够省略一个参数,并让默认值在
    调用中接管
    ,但当我尝试执行以下操作时,我遇到了某种内存引用错误:
    使用省略的0,“F”调用“Display String”。我读了一些关于
    省略的文档,但不了解如何使其工作


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

    在Cobol中,调用程序与被调用模块完全分开编译,没有像C中那样的头文件。因此,在编译调用程序时,编译器不知道被调用程序的参数的格式。Cobol编译器将根据其拥有的一组规则格式化参数。Cobol编译器决定的格式可能与调用程序期望的格式不同

    因此,如果有疑问,请在调用时使用变量

    就你而言,我怀疑

    CALL 'Display-String' USING WS-My-String, '010', 'F'
    

    将起作用

    调用
    语句有三个使用选项:
    通过引用
    <代码>按内容分类
    <代码>按值计算<代码>省略。好的,四个,然后数最后一个

    当通过引用指定时,它们是默认值。指定的最新选项引用调用中的以下项。。。使用。。。直到出现另一个选项

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

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

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

    如果您使用BY VALUE,您还必须使用。。。(或输入…使用…)项

    然而,这并不是你故事的结尾,因为有一个bug。我建议您考虑升级到GnuCOBOL(OpenCOBOL的新名称)2。您可以在SourceForge.Net的GnuCOBOL讨论区找到关于这个问题的讨论。会修好的。如果你感兴趣,你可以自己修复它,并将其包含在源代码中

    应该包括问题一和问题二

    第三,有趣的问题。不是COBOL的标准方式,因为COBOL本身没有换行等。对于GnuCOBOL区域来说,这是一个很好的问题。您可以显示具有适当值的十六进制文字,但这是不可传输的。各种COBOL编译器都有语言扩展。我不知道在没有数据显示的情况下是否可以使用。有一个Z-literal,它是一个由二进制零“终止”的literal,但我不认为literal内容可以“丢失”。其他人会有意见和想法

    第四,您应该能够在通话中使用省略。不能将省略用于按值项,但可以用于按引用和按内容项

    能够使用它也意味着能够在你的程序中处理它。如果调用程序时忽略了字符串,则程序将失败,因为它假定有一个字段/值可访问,而不会有


    好的,复习一下

    PROCEDURE DIVISION USING LS-Input-String, LS-Input-Length,
               LS-Advancing.
    
    代码中的逗号不起任何作用。如果要突出显示分离性:

    PROCEDURE DIVISION            USING LS-Input-String
                                        LS-Input-Length
                                        LS-Advancing
                                        .
    
    如果有人不小心离开了,,,躺在那里,其他人可能会认为“这一定意味着什么”

    获取标识符长度有两种方法:
    length of
    <代码>函数长度。后者允许这样做:

       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 )
    
    支架周围至少应有空格

    要检查完全空白的I。。。检查是否完全为空,但更早。保存循环在这种情况下,简化了循环的终端条件:

       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
       .
    
    在程序部分I中,仅在标签或章节的末尾或其自身的一行对句号/句号进行编码。在移动代码或插入新代码时,您不必担心移动句号/句点

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

    按照您的编码方式,如果省略了字符串的长度,则调用程序必须提供255字节的字符串和标识符。如果没有,那么被调用的程序将接收不应该接收的内容

    如果这是你想要的,
    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
       .
    
    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