【问题标题】:Data type in COBOLCOBOL 中的数据类型
【发布时间】:2016-01-17 12:40:38
【问题描述】:

我已经编写了以下程序,我很困惑为什么当我编译程序时我得到一个错误,说 A-COL(1,1) 不是数值,而显示 A-COL(1,1) 给了我1.

   IDENTIFICATION DIVISION.
   PROGRAM-ID. TEST1.
   DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 DIFF PIC 9(3).
       01 ARRAY.
           05 A-ROW OCCURS 99 TIMES.
               10 A-COL OCCURS 2 TIMES.
                   15 TABLE-CONTENT PIC 9(3).

   PROCEDURE DIVISION.
       MOVE 1 TO A-COL(1,1).
       MOVE 2 TO A-COL(2,1).
       DISPLAY A-COL(1,1).
       COMPUTE DIFF = A-COL(1,1) - A-COL(2,1).
       DISPLAY DIFF.
   STOP RUN.

【问题讨论】:

  • 哪一行给出了错误?

标签: cobol gnucobol


【解决方案1】:

将 A-COL 定义更改为

"10 A-COL PIC 9(3) OCCURS 2 TIMES."

并删除TABLE-CONTENT

组变量被视为字母数字(X 类型),因此不能用于计算。

您也可以这样做 - 使用实际的数字字段来引用地址位置。

PROCEDURE DIVISION.
   MOVE 1 TO TABLE-CONTENT(1,1).
   MOVE 2 TO TABLE-CONTENT(2,1).
   DISPLAY A-COL(1,1).
   COMPUTE DIFF = TABLE-CONTENT(1,1) - TABLE-CONTENT(2,1).
   DISPLAY DIFF.

您可能还想让DIFF 签名。

附加信息

A-COL(1,1) 显示“1”,因为它将数据存储为“1xx”,其中 x = 空格。那不是一个数值。当您在此处运行解决方案时,您会注意到显示行生成“001”。

【讨论】:

  • 好像已经解决了问题,但是你知道我为什么不应该这样写吗?
  • 您不能在 COMPUTE 中引用组级别项,因为组项被视为 ALPHANUMERIC,您无法对 ALPHANUMERIC 项执行算术运算。因此会引发编译时错误。
【解决方案2】:

保持您的 WORKING-STORAGE 结构不变。但是,您的数据元素不是 A-COL,而是 THE-CONTENT。所以使用 THE-CONTENT,而不是 A-COL。

   IDENTIFICATION DIVISION.
   PROGRAM-ID. TEST1.
   DATA DIVISION.
   WORKING-STORAGE SECTION.
   01  DIFF PIC S9(3).
   01  ARRAY.
       05  A-ROW 
           OCCURS 99 TIMES.
           10  A-COL 
               OCCURS 2 TIMES.
               15 TABLE-CONTENT            PIC 9(3).

   PROCEDURE DIVISION.
       MOVE 1                       TO TABLE-CONTENT ( 1 1 )
       MOVE 2                       TO TABLE-CONTENT ( 2 1 )
       DISPLAY 
               ">"
               TABLE-CONTENT ( 1 1 )
               "<"
       COMPUTE DIFF                 = TABLE-CONTENT ( 1 1 ) 
                                    - TABLE-CONTENT ( 2 1 )
       DISPLAY 
               ">"
               DIFF
               "<"
       STOP RUN
       .

您的结构更好,因为它更易于维护。如果你想重新定义表内容,你可以在不改变结构的情况下。如果你现在将结构“复杂化”,则不是这样。

是的,如果您将数字文字移动到组项,则执行字母数字 MOVE,结果将是您的文字左对齐并向右填充空格,或向右截断,或刚好合适,具体取决于文字的大小。

虽然从概念上讲,您的表中有“列”(COBOL 没有数组,但它有带有 OCCURS 的表),但请注意,您无法访问整个列。在存储中,您有 row-1-col-1、row-1-col-2、row-2-col-1、row-2-col-2 到 row-99-col-1、row-99-col -2.

任何算术(加法、减法、乘法、除法和计算)只能使用数字字段或文字作为源数据。字段包含“数字”是不够的,必须是数字字段。

GIVING(加法、减法、乘法和除法)可以将结果放在特定类型的非数字字段中,即数字编辑字段中。这是一个带有 PICture 子句的字段,其中包含数字编辑 PICture 符号。

【讨论】:

  • 谢谢,我明白了!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-25
  • 2019-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多