我写了下面的程序,我很困惑为什么当我编译程序时我得到一个错误,说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.
答案 0 :(得分:5)
将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”。
答案 1 :(得分: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
.
您的结构更好,因为它更容易维护。如果您想要重新定义TABLE-CONTENT,您可以在不改变结构的情况下使用。不是这样,如果你&#34;复杂&#34;结构现在。
是的,如果您将数字文字移动到一个组项,则执行字母数字MOVE,结果将是您的文字左对齐和空格填充到右侧,或截断到右侧,或者只是适合,取决于你的文字的大小。
虽然从概念上讲你有&#34;列&#34;在你的表中(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。
任何算术(ADD,SUBTRACT,MULTIPLY,DIVIDE和COMPUTE)只能使用数字字段或文字作为源数据。字段包含&#34;数字&#34;是不够的,它必须是数字字段。
GIVING(ADD,SUBTRACT,MULTIPLY和DIVIDE)可以将结果放在特定类型的非数字字段中,这是一个数字编辑的字段。这是一个包含PICture子句的字段,包含数字编辑PICture符号。