问题描述
我正在研究在HP Nonstop上部署的Cobol应用程序。在平台上进行调试时,我遇到以下情况:
IF LABELED-VALUE OF IN-VARIABLE-1 OF PARENT-1 OF GRAND-PARENT THEN
MOVE IN-VARIABLE-2 OF PARENT-2 OF GRAND-PARENT TO OUT-VARIABLE
ELSE
MOVE IN-VARIABLE-1 OF PARENT-1 OF GRAND-PARENT TO OUT-VARIABLE
END-IF
字段定义如下:
01 GRAND-PARENT
03 PARENT-1.
05 IN-VARIABLE-1 PIC 9(3).
88 LABELED-VALUE VALUE 000.
03 PARENT-2.
05 IN-VARIABLE-2 PIC 9(3).
01 OUT-VARIABLE PIC 9(3).
当我评估表达式LABELED-VALUE OF IN-VARIABLE-1 OF PARENT OF GRAND-PARENT
时,调试器会告诉我该表达式为TRUE
。 IN-VARIABLE-1 OF PARENT OF GRAND-PARENT
的值为0。因此,OUT-VARIABLE
应该具有相应的值。但这种情况并非如此;它始终具有值IN-VARIABLE-1
,并且逻辑总是输入ELSE
。
在这里,您可以在执行代码后看到调试器中的情况:
到目前为止,我已经尝试过:
- 调整
IF
的条件以检查特定值,例如IF IN-VARIABLE-1 OF PARENT OF GRAND-PARENT EQUAL ZERO THEN
(ZERO
实际上是LABELED-VALUE
的值) - 在我的调试器中,它会显示旧版本的代码,但会显示最新版本的执行行指示符。这可能会导致指示符显示在错误的行前面。为了避免这种情况,我对注释进行了更改,重新编译,重新启动服务器类,然后重新附加到该过程中。这样,实际上我已经获得了该源的最新版本,因此可以排除此问题。
我不是Cobol专家,尽管我认为简单的IF
是可以管理的,但没有用。有人可以帮我吗?
更新:
在调试器中,我可以编辑字段的值。如果在if之前用000
或IN-VARIABLE-1 OF PARENT-1 OF GRAND-PARENT
再次覆盖0
的现有值000
,则代码可以正常工作。 WTF?
解决方法
问题实际上与IN-VARIABLE-1 OF PARENT-1 OF GRAND-PARENT
的初始化方式有关。就我而言,它很可能尚未初始化。在这种情况下,可以通过以下方式解决问题:
IF LABELED-VALUE OF IN-VARIABLE-1 OF PARENT-1 OF GRAND-PARENT OR
IN-VARIABLE-1 OF PARENT-1 OF GRAND-PARENT EQUAL LOW-VALUES
THEN
MOVE IN-VARIABLE-2 OF PARENT-2 OF GRAND-PARENT TO OUT-VARIABLE
ELSE
MOVE IN-VARIABLE-1 OF PARENT-1 OF GRAND-PARENT TO OUT-VARIABLE
END-IF