COBOL移到comp-3变量时出现问题
我在OpenVMS上运行的COBOL程序中遇到以下问题 我有以下变量声明:COBOL移到comp-3变量时出现问题,cobol,Cobol,我在OpenVMS上运行的COBOL程序中遇到以下问题 我有以下变量声明: 01 STRUCT-1. 02 FIELD-A PIC S9(6) COMP-3. 02 FIELD-B PIC S9(8) COMP-3. 01 STRUCT-2. 03 SUB-STRUCT-1. 05 FIELD-A PIC 9(2).
01 STRUCT-1.
02 FIELD-A PIC S9(6) COMP-3.
02 FIELD-B PIC S9(8) COMP-3.
01 STRUCT-2.
03 SUB-STRUCT-1.
05 FIELD-A PIC 9(2).
05 FIELD-B PIC 9(4).
03 SUB-STRUCT-2.
05 FIELD-A PIC 9(4).
05 FIELD-B PIC 9(2).
05 FIELD-C PIC 9(2).
以及以下代码:
* 1st Test:
MOVE 112011 TO FIELD-A OF STRUCT-1
MOVE 20100113 TO FIELD-B OF STRUCT-1
DISPLAY "FIELD-A : " FIELD-A OF STRUCT-1 CONVERSION
DISPLAY "FIELD-B : " FIELD-B OF STRUCT-1 CONVERSION
* 2nd Test:
MOVE 112011 TO SUB-STRUCT-1.
MOVE 20100113 TO SUB-STRUCT-2.
MOVE SUB-STRUCT-1 TO FIELD-A OF STRUCT-1
MOVE SUB-STRUCT-2 TO FIELD-B OF STRUCT-1
DISPLAY "SUB-STRUCT-1 : " SUB-STRUCT-1
DISPLAY "SUB-STRUCT-2 : " SUB-STRUCT-2
DISPLAY "FIELD-A : " FIELD-A OF STRUCT-1 CONVERSION
DISPLAY "FIELD-B : " FIELD-B OF STRUCT-1 CONVERSION
* 3RD TEST:
MOVE 112011 TO SUB-STRUCT-1.
MOVE 20100113 TO SUB-STRUCT-2.
MOVE SUB-STRUCT-1N TO FIELD-A OF STRUCT-1
MOVE SUB-STRUCT-2N TO FIELD-B OF STRUCT-1
DISPLAY "SUB-STRUCT-1 : " SUB-STRUCT-1
DISPLAY "SUB-STRUCT-2 : " SUB-STRUCT-2
DISPLAY "FIELD-A : " FIELD-A OF STRUCT-1
DISPLAY "FIELD-B : " FIELD-B OF STRUCT-1
哪些产出:
FIELD-A : 112011
FIELD-B : 20100113
SUB-STRUCT-1 : 112011
SUB-STRUCT-2 : 20100113
FIELD-A : 131323
FIELD-B : 23031303
为什么FIELD-A
和FIELD-B
的值与我在第二次测试中输入的值不同?
在我的程序中,我有从
显示
到COMP-3
变量的其他移动,但我没有得到这种行为。在COBOL中,组级数据是无类型的,并且在不强制转换的情况下移动
元素级数据始终具有关联的数据类型。打字
将强制转换数据以匹配类型
在移动过程中接收元件的移动
在第一个实例中,您将一个文本数字值(112011
)移动到压缩的十进制字段中,编译器在该过程中将其转换为正确的数据类型。正如您在任何编程语言中所期望的那样
在第二个实例中,您将文本值移动到组项。由于这是一个组项,编译器无法“知道”预期的数据类型,因此它总是将组移动作为字符数据(无数字转换)。当接收项具有与字符数据兼容的PICTURE
子句时,这是正常的,字符数据FIELD-a
和FIELD-B
子结构-1的类型为。当存储为PIC X
和存储为PIC 9
时,9
的内部表示形式没有区别。这两种情况都假定为使用情况显示
现在,当您将组级别从子结构-1
移动到COMP-3(压缩十进制)时,您有效地告诉编译器不要从显示
转换为COMP-3
格式。这就是你得到的
尝试对代码进行以下修改。使用重新定义
创建
用于移动的数字基本项。COBOL将执行适当的操作
移动基本数据时的数据转换
01 STRUCT-2.
03 SUB-STRUCT-1.
05 FIELD-A PIC 9(2).
05 FIELD-B PIC 9(4).
03 SUB-STRUCT-1N REDEFINES
SUB-STRUCT-1 PIC 9(6).
03 SUB-STRUCT-2.
05 FIELD-A PIC 9(4).
05 FIELD-B PIC 9(2).
05 FIELD-C PIC 9(2).
03 SUB-STRUCT-2N REDEFINES
SUB-STRUCT-2 PIC 9(8).
以及以下代码:
* 1st Test:
MOVE 112011 TO FIELD-A OF STRUCT-1
MOVE 20100113 TO FIELD-B OF STRUCT-1
DISPLAY "FIELD-A : " FIELD-A OF STRUCT-1 CONVERSION
DISPLAY "FIELD-B : " FIELD-B OF STRUCT-1 CONVERSION
* 2nd Test:
MOVE 112011 TO SUB-STRUCT-1.
MOVE 20100113 TO SUB-STRUCT-2.
MOVE SUB-STRUCT-1 TO FIELD-A OF STRUCT-1
MOVE SUB-STRUCT-2 TO FIELD-B OF STRUCT-1
DISPLAY "SUB-STRUCT-1 : " SUB-STRUCT-1
DISPLAY "SUB-STRUCT-2 : " SUB-STRUCT-2
DISPLAY "FIELD-A : " FIELD-A OF STRUCT-1 CONVERSION
DISPLAY "FIELD-B : " FIELD-B OF STRUCT-1 CONVERSION
* 3RD TEST:
MOVE 112011 TO SUB-STRUCT-1.
MOVE 20100113 TO SUB-STRUCT-2.
MOVE SUB-STRUCT-1N TO FIELD-A OF STRUCT-1
MOVE SUB-STRUCT-2N TO FIELD-B OF STRUCT-1
DISPLAY "SUB-STRUCT-1 : " SUB-STRUCT-1
DISPLAY "SUB-STRUCT-2 : " SUB-STRUCT-2
DISPLAY "FIELD-A : " FIELD-A OF STRUCT-1
DISPLAY "FIELD-B : " FIELD-B OF STRUCT-1
当心:在引用接收项目时,将字符数据移动到COMP-3字段可能会导致可怕的SOC7数据异常异常异常终止。这是因为并非所有位模式都是有效的COMP-3编号。您有两个问题
COBOL有几个数字数据结构。每个都有自己的一套规则
对于压缩小数(COMP-3)
•PIC条款中的数字成分应始终相加为奇数。
•小数点标记“V”确定小数点的位置。
•单个元素移动和数学函数将保持十进制值对齐–可以进行高电平和低电平截断
•数字数据类型转换(区域十进制到压缩以及二进制到压缩)为您处理
e、 g.S9(5)V9(2)COMP-3.
包括2个十进制位置>
长度计算为四舍五入[(7+1)/2]=4字节
S9(6)V9(2) COMP-3.
包括2个十进制位置>
长度计算为向上取整[(8+1)/2]=5字节
但第一个½字节不可寻址
COMP-3字段的最后½字节是符号的十六进制表示。
符号½字节值为C=有符号正D=有符号负F=无符号(非COBOL)
S9(6)V9(3)COMP-3值123.45。
长度计算为向上取整[(9+1)/2]=5字节
包含X'00 01 23 45 0C'
注意十进制对齐和零填充
组级移动规则
COBOL数据字段结构定义为层次结构
01 H-L集团字段–&任何子集团级别字段–
几乎总是一个隐含的字符串值
如果单个元素字段是01或77级别–则可以是数字李>
如果作为单个元素字段引用,则在组或子组级别下定义为数字的单个元素字段将被视为数字字段李>
数字规则适用。
o正确证明
o小数点对齐
o带零的焊盘H-L(½字节)
o数字数据类型转换
移动或数学计算的接收字段确定是否将发生数字数据转换
数字数据转换
如果使用任何发送字段类型(组或元素)将数学计算移动或执行到使用数字PIC子句定义的任何接收单个元素字段,则接收字段将发生数字数据转换。S0C7当非数值数据移动到接收数值定义的字段或尝试使用非数值数据进行数学计算时,会发生异常终止
没有数字数据转换
如果将任何字段类型(组或元素)移动到任何组或子组级别的字段,则不会进行数字数据转换。
•字符移动规则适用。
•左对齐并用空格填充
这是数字定义字段中出现非数字数据的主要原因之一
将包含数字元素字段的发送组级别移动到包含数字元素字段的接收组级别(映射相同)的主要用途之一是使用1个移动指令重新初始化数字元素字段
对于表组级别大于255字节的表清除,也可以进行清除掩码或数据传播移动 伙计,这让我回想起过去。我记得当我们想查看压缩十进制字段的最后一个字节时,因为“04”表示有人在带有EBCDIC空格的值中移动了。@David Thornley。接近。。。EBCDIC空间为十六进制“40”。今天,我们对压缩的十进制字段使用IF NUMERIC
测试来检查这类事情。让许多程序员感到困惑的是,MOVE
并没有爆炸,但此后对字段的任何计算引用最终都会导致数据异常异常异常异常异常终止(IBM land中的SOC7)。大多数人都希望移动