Cobol 不进入 if,尽管条件为真
Cobol not entering if, although condition is true
我正在开发部署在 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 之前用 0
或 000
再次覆盖 IN-VARIABLE-1 OF PARENT-1 OF GRAND-PARENT
的现有值 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
我正在开发部署在 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 之前用 0
或 000
再次覆盖 IN-VARIABLE-1 OF PARENT-1 OF GRAND-PARENT
的现有值 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