【问题标题】:Unstring a field which is of variable length in COBOL and separated by spaces取消字符串 COBOL 中可变长度并用空格分隔的字段
【发布时间】:2021-07-21 09:51:44
【问题描述】:

我有一个具有可变值或没有值的字段。该字段是

Ws-var = "12 11 87 98"

这里“12 11”需要是一对,“87 98”应该是另一对。该变量是动态的,可能包含更多这样的对。截至目前,我将 COBOL 代码编写为

Unstring ws-field delimited by space into
    Ws-temp1,ws-temp2,ws-temp3,ws-temp4. 

这些值将仅用于成对处理。 当有 2 对值时,此代码将起作用。但是,如果将来条件改变需要更多这样的对,我想用一个数组来实现,将每一对移动到一个输出字段,然后读取下一对。您能提出一些实施方法吗?

【问题讨论】:

    标签: arrays string cobol


    【解决方案1】:

    您可以使用字符串指针和表格来实现这一点。使用UNSTRING,字符串指针指定从 UNSTRING 开始的位置,并自动增加到下一个分隔符之后的点(请注意,这也可能意味着:当目标字段为“满”时)。

           77  str-ptr                USAGE BINARY-LONG UNSIGNED.
           01  var-pair.
               05  var-a              PIC 9(04). *> or whatever your size is
               05  filler             PIC X.     *> to have exactly one space
               05  var-b              PIC 9(04). *> or whatever your size is
          *> for "standard" COBOL use 01 CONSTANT AS - or just hard-wire below
           78  var-pair-length        VALUE LENGTH OF var-pair.
           78  var-pair-max           VALUE 500. *> or whatever you need
           77  var-pair-cnt           USAGE BINARY-LONG UNSIGNED.
           01  var-pairs.
               05  pair               PIC X(var-pair-length) OCCURS  0 TO var-pair-max
                                                             DEPENDING ON var-pair-cnt.
        
    
               MOVE 1 TO str-ptr
               PERFORM var-pair-cnt FROM 1 BY 1
                       UNTIL var-pair-cnt > var-pair-max
                  MOVE SPACES TO ws-temp1, ws-temp2
                  UNSTRING ws-var DELIMITED BY ALL SPACE
                      INTO ws-temp1, ws-temp2
                      WITH POINTER str-ptr
                  IF ws-temp1 = SPACES
                     EXIT PERFORM
                  END-IF
                  MOVE FUNCTION NUMVAL (ws-temp1) TO var-a
                  MOVE FUNCTION NUMVAL (ws-temp2) TO var-b
                  MOVE var-pair                   TO pair (var-pair-cnt)
               END-PERFORM
    
    

    您可能需要添加一些验证和/或调整定义,但我认为上面的代码传达了这个想法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-11
      • 1970-01-01
      • 2011-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多