首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >COBOL移动到comp-3变量的问题

COBOL移动到comp-3变量的问题
EN

Stack Overflow用户
提问于 2010-07-01 20:48:47
回答 2查看 37.9K关注 0票数 8

在运行在OpenVMS上的COBOL程序中,我遇到了以下问题。

我有以下变量声明:

代码语言:javascript
复制
       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).

以及以下代码:

代码语言:javascript
复制
      * 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

其中产出:

代码语言:javascript
复制
FIELD-A       :  112011
FIELD-B       :  20100113
SUB-STRUCT-1  : 112011
SUB-STRUCT-2  : 20100113
FIELD-A       :  131323
FIELD-B       :  23031303

为什么FIELD-A FIELD-B 持有与我在第二次测试中所使用的值不同的值?

在我的程序中,我还有其他从DISPLAYCOMP-3变量的步骤,在这些步骤中,我无法理解这种行为。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-07-02 12:23:33

在COBOL中,组级数据是无类型的,无需转换即可移动。

元素级数据始终具有关联的数据类型。类型数据转换为在MOVE期间匹配接收元素的类型。

在第一个实例中,您可以将一个文字数字值( MOVE )转换为一个打包的十进制字段,编译器将其转换为进程中正确的数据类型。正如您在任何编程语言中所期望的那样。

在第二个实例中,可以将文本值MOVE为组项。由于这是一个组项,编译器不能“知道”预期的数据类型,所以它总是将组移动为字符数据(没有数字转换)。当接收项有一个与字符数据兼容的PICTURE子句( FIELD-AFIELD-B of SUB-STRUCT-1 )时,这是很好的。9作为PIC X存储时和以PIC 9存储时的内部表示没有区别。两者都假定为USAGE DISPLAY

现在,当您将组级别从SUB-STRUCT-1移到COMP-3 (打包十进制)时,您实际上告诉编译器不要从DISPLAY格式转换为COMP-3格式。这就是你得到的。

尝试对代码进行以下修改。使用REDEFINES为移动创建一个数字基本项。COBOL将在移动基本数据时进行适当的数据转换。

代码语言:javascript
复制
       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).

以及以下代码:

代码语言:javascript
复制
      * 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数据异常abend。这是因为并非所有的位模式都是有效的COMP-3数字。

票数 5
EN

Stack Overflow用户

发布于 2010-07-21 19:27:33

你有两个问题。

COBOL有几个数字数据结构。每个人都有自己的一套规则。

包装小数( COMP-3 )

事先知情同意条款的数字构成部分应总是加起来是一个奇数。小数点标记“V”决定小数点的位置。·单个元素的移动和数学函数将保持十进制值对齐--高和低级别截断都是可能的。数字数据类型转换(从十进制到打包,二进制到打包)是可以处理的。

例如S9(5)V9(2) COMP-3。

包括2小数位positions>长度的计算形式为(7 + 1) /2=4个字节

代码语言:javascript
复制
     S9(6)V9(2) COMP-3.                                            

包含两个小数位数>长度的计算形式是(8+ 1) /2=5字节,但第一个5字节是不可寻址的。

COMP-3字段的最后半字节是符号的HEXIDECIMAL表示。

符号半字节值为C=有符号正D=符号负数F=无符号(非COBOL)。

S9(6)V9(3) COMP-3值为123.45.长度计算为(9+ 1) /2=5个字节

包含X‘00 01 23 45 0 C’

注意小数对齐&零填充。

组级移动规则

COBOL数据字段结构被定义为层次结构。

01 H-L组字段-和任何子组级别字段-

  1. 几乎总是一个隐含的字符串值
  2. ,如果单个元素字段是01或77级别,那么它可以是数字。如果作为单个元素字段引用,则在组或子组级别下定义为数字的
  3. 单个元素字段将被视为数字。适用
  4. 数字规则。O右对齐o小数位对齐o pad H-L (半字节)与零o数字数据类型转换

移动或数学计算的接收字段确定是否将发生数字数据转换。

如果您使用任何发送字段类型(组或元素)向使用数字PIC子句定义的任何接收单个元素字段移动或执行数学计算,则将对接收字段进行数值数据转换。当非数字数据移动到接收数字定义的字段或当尝试使用非数字数据进行数学计算时,S0C7 abends就会发生。

如果将任何字段类型(组或元素)移动到任何组或子组级别字段,则不会进行数字数据转换。

*适用字符移动规则。

·左对齐&带空格的衬垫。

这是数字定义字段中非数字数据的主要原因之一。

将包含数字元素字段的发送组级别移动到包含数字元素字段的接收组级别(映射相同)的主要用途之一是使用1 MOVE指令重新初始化数字元素字段。

对于表清除(其中表组级别大于255个字节),也可以使用一个清晰的掩码或数据传播移动。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3161546

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档