改造Cobol项目应该注意的几个问题
最近在做一个改造项目,把一个很古老的Cobol项目改造为PL/SQL项目。
在最开始的Cobol代码解析的时候,由于对Cobol语言特点的不熟悉,造成了到测试阶段的一些麻烦。
下面就关于Cobol里面字符型,数值型的用法和区别。
以下的说明基于下述变量:
01 T-DECIMAL PIC 9(04)V9(2).
01 T-DECIMAL-R REDEFINES T-DECIMAL.
03 T-DECIMAL1 PIC X(04).
03 T-DECIMAL2 PIC X(02).
01 T-CHAR PIC X(04).
01 T-INTEGER PIC 9(02).
01 T-DECIMAL-ED PIC 9999.99.
01 T-EDIT PIC X(08).
1)初始化
Cobol语言中的字符型声明如下:
01 T-CHAR PIC X(04).
01 T-INTEGER PIC 9(02).
声明两个变量,一个是四位的字符,一个是两位的数值。
在调用初始化语句之前,这两个变量的值都是类似于NULL的。
在调用了INITIALIZE语句,对这两个变量初始化之后,字符串的T-CHAR被初始化成了四个空格,
而数值型的T-INTEGER被初始化为两个0。
以上可知,字符型的变量会被初始化为满位的空格,而数值型的变量会被初始化为满位的0。
2)赋值
下面看一下赋值的情况。
MOVE 123456789 TO T-CHAR.
DISPLAY T-CHAR.
ADD 123 TO T-INTEGER
DISPLAY T-INTEGER.
第一个显示的是1234,第二个显示的是23。
可知,Cobol在处理数值型的时候,如果位数不够,会把前面的舍去,而字符型的是把后面的舍去。
上面的是位数过多的情况,位数不足的情况怎么样呢?
MOVE 12 TO T-CHAR.
DISPLAY T-CHAR.
MOVE 123.45 TO T-DECIMAL.
DISPLAY T-DECIMAL1.
第一个显示的是12 ,第二个显示的是0123,
很有意思的,字符型的会在后面补空格,而数值型的会在前面补0。
3)特殊情况
一个是转型,一个是数值型的运算。
MOVE 1234.56 TO T-DECIMAL.
MOVE T-DECIMAL TO T-DECIMAL-ED.
MOVE T-DECIMAL-ED TO T-EDIT.
DISPLAY T-DECIMAL.
DISPLAY T-EDIT.
MOVE 98 TO T-INTEGER.
ADD 1 TO T-INTEGER.
DISPLAY T-INTEGER.
ADD 1 TO T-INTEGER.
DISPLAY T-INTEGER.
打出来的依次是:+123456,1234.56,+99,+00。
应该说,这个结果是很出乎我的意料的。
T-DECIMAL没有问题,在内存中是不会存储小数点的,打出来+123456时可以理解的。
但是经过转型变换之后,T-EDIT竟然会打印出来小数点,这个很是奇怪,不过事实就是这样,
我个人的估计是Cobol在处理这样的转型的时候,自己加上了小数点。
后面的两个,特别是最后一个,应该还是比较容易理解的。
99加上1就是100,但是这个变量只有两位,把前面的1舍去,就成了00。
这个地方在有运算的时候应该尤其注意。
这是在解析Cobol代码的时候需要注意的地方,同样的,在转换为PL/SQL的时候,这也应该是需要注意的地方。
浙公网安备 33010602011771号