使用PERFORM VARYING时WS-INDICE溢出:到达9后重置为0
问题原因
WS-INDICE被声明为PIC 9(01),这是一位数字型数据,当它的值递增到9后,再加1会触发数值溢出回滚,值变为0而非10。此时循环的终止条件WS-INDICE > 9永远无法满足,循环会继续执行,尝试访问数组下标0的位置(而数组TEST-GROUP仅OCCURS 9次,合法下标为1-9),最终导致循环异常。
解决方案
方案1:修改索引变量的长度
将WS-INDICE的声明改为支持两位数字的类型,确保9加1后能正确变为10,触发终止条件:
01 WS-INDICE PIC 9(02).
方案2:调整循环终止条件(需配合变量长度修改)
如果保留原变量长度,可直接将终止条件改为判断索引是否达到10(需确保变量能容纳该值,因此优先推荐方案1):
PERFORM VARYING WS-INDICE FROM 1 BY 1 UNTIL WS-INDICE = 10 OR TEST-OBJEC(WS-INDICE) = SPACES MOVE TEST-OBJEC(WS-INDICE) TO WS-VAL-OBJEC(WS-INDICE) MOVE TEST-DATE(WS-INDICE) TO WS-DAT-OBJEC(WS-INDICE) END-PERFORM
补充说明
COBOL中数字型数据的溢出处理是回滚到最小值(对于PIC 9(n)来说就是0),所以务必确保索引变量的长度足够容纳循环的最大递增值,避免溢出导致的逻辑异常。
内容的提问来源于stack exchange,提问作者Ahmed SEDDIK
相关产品推荐
相关产品推荐

