if语句中的错误

鲍勃

我在一个(但不是两个)if语句中遇到以下错误。

 165  IGYPS2000-S   Expected a data-name, but found "TO".  The "ADD" statement was discarded.

 169  IGYPS2096-S   An incomplete condition was found in a conditional expression.  The operand(s) was(were) discarded.

 169  IGYPS2079-S   Expected a verb or "NEXT SENTENCE", but found ""F"".  The statement was discarded.            




           IF MARITAL-STATUS-IN = "S"
           ADD 1 TO SINGLE-COUNT
           ADD 1 TO OVERALL-COUNT
           ADD SALARY-IN TO SINGLE-TOTAL
           ADD SALARY-IN TO OVERALL-TOTAL
           IF GENDER-IN = "M"
               ADD 1 TO SINGLE-MALE-COUNT
               ADD SALARY-IN TO SINGLE-MALE-TOTAL
           IF GENDER-IN = "F"
               ADD 1 TO SINGLE-FEMALE-COUNT
               ADD SALARY-IN TO SINGLE-FEMALE-TOTAL
       END-IF.

       IF MARITAL-STATUS-IN = "M"
           ADD 1 TO MARRIED-COUNT
           ADD 1 TO OVERALL-COUNT               line 165
           ADD SALARY-IN TO MARRIED-TOTAL
           ADD SALARY IN TO OVERALL-TOTAL
           IF GENDER-IN = "M"
               ADD 1 TO MARRIED-MALE-COUNT
               ADD SALARY-IN TO MARRIED-MALE-TOTAL
           IF GENDER-IN "F"
               ADD 1 TO MARRIED-FEMALE-COUNT
               ADD SALARY-IN TO MARRIED-FEMALE-TOTAL
       END-IF.

如果您需要查看我的代码,请告诉我。这是我第一次写嵌套的if。

比尔·伍德格

piet.t和Bruce Martin已经正确发现了错误,这些错误使您可以进行编译器诊断。您将错误的行列为165并没有帮助。

要避免此问题,很容易做的就是让编译器嵌入诊断程序,并在编译结束时列出它们。的确,将其设置为默认值是很不寻常的。

要解决它不是默认设置,您可以执行以下操作:

CBL FLAG(I,I)

在第12列中开始进行测试,并使其成为程序源中的第一行。

我首先说的是“在编译列表的末尾列出诊断消息,从严重性I到更高”。第二个我说:“从严重性I开始,将诊断消息嵌入到源的编译列表中”。

所有编译器选项和有关使用它们的方法的信息都包含在《企业COBOL编程指南》中,可从IBM的Internet上免费获得。

清单的相关部分看起来像这样(我只是粘贴而未参考实际清单):

   IF MARITAL-STATUS-IN = "S"
   ADD 1 TO SINGLE-COUNT
   ADD 1 TO OVERALL-COUNT
   ADD SALARY-IN TO SINGLE-TOTAL
   ADD SALARY-IN TO OVERALL-TOTAL
   IF GENDER-IN = "M"
       ADD 1 TO SINGLE-MALE-COUNT
       ADD SALARY-IN TO SINGLE-MALE-TOTAL
       IF GENDER-IN = "F"
           ADD 1 TO SINGLE-FEMALE-COUNT
           ADD SALARY-IN TO SINGLE-FEMALE-TOTAL
   END-IF.

   IF MARITAL-STATUS-IN = "M"
       ADD 1 TO MARRIED-COUNT
       ADD 1 TO OVERALL-COUNT              
       ADD SALARY-IN TO MARRIED-TOTAL
       ADD SALARY IN TO OVERALL-TOTAL
 165  IGYPS2000-S   Expected a data-name, but found "TO".  The "ADD" statement was discarded.

       IF GENDER-IN = "M"
           ADD 1 TO MARRIED-MALE-COUNT
           ADD SALARY-IN TO MARRIED-MALE-TOTAL
       IF GENDER-IN "F"
 169  IGYPS2096-S   An incomplete condition was found in a conditional expression.  The operand(s) was(were) discarded.

 169  IGYPS2079-S   Expected a verb or "NEXT SENTENCE", but found ""F"".  The statement was discarded.            
           ADD 1 TO MARRIED-FEMALE-COUNT
           ADD SALARY-IN TO MARRIED-FEMALE-TOTAL
   END-IF.

如前所述,构建IF的方式也存在一些问题:

IF MARITAL-STATUS-IN = "S"
    ADD 1 TO SINGLE-COUNT
    ADD 1 TO OVERALL-COUNT
    ADD SALARY-IN TO SINGLE-TOTAL
    ADD SALARY-IN TO OVERALL-TOTAL
    IF GENDER-IN = "M"
        ADD 1 TO SINGLE-MALE-COUNT
        ADD SALARY-IN TO SINGLE-MALE-TOTAL
            IF GENDER-IN = "F"
                ADD 1 TO SINGLE-FEMALE-COUNT
                ADD SALARY-IN TO SINGLE-FEMALE-TOTAL
            END-IF.

            IF MARITAL-STATUS-IN = "M"
                ADD 1 TO MARRIED-COUNT
                ADD 1 TO OVERALL-COUNT              
                ADD SALARY-IN TO MARRIED-TOTAL
                ADD SALARY IN TO OVERALL-TOTAL
                IF GENDER-IN = "M"
                    ADD 1 TO MARRIED-MALE-COUNT
                    ADD SALARY-IN TO MARRIED-MALE-TOTAL
                    IF GENDER-IN "F"
                        ADD 1 TO MARRIED-FEMALE-COUNT
                        ADD SALARY-IN TO MARRIED-FEMALE-TOTAL
                    END-IF.

您正在使用两种不同的方法来终止您的IF。END-IF范围定界符和句号/句点。使用第二个表示您的缩进与“逻辑”缩进不匹配。

IF MARITAL-STATUS-IN = "S"
    ADD 1 TO SINGLE-COUNT
    ADD 1 TO OVERALL-COUNT
    ADD SALARY-IN TO SINGLE-TOTAL
    ADD SALARY-IN TO OVERALL-TOTAL
    IF GENDER-IN = "M"
        ADD 1 TO SINGLE-MALE-COUNT
        ADD SALARY-IN TO SINGLE-MALE-TOTAL
            IF GENDER-IN = "F"
                ADD 1 TO SINGLE-FEMALE-COUNT
                ADD SALARY-IN TO SINGLE-FEMALE-TOTAL
            END-IF.

IF MARITAL-STATUS-IN = "M"
    ADD 1 TO MARRIED-COUNT
    ADD 1 TO OVERALL-COUNT              
    ADD SALARY-IN TO MARRIED-TOTAL
    ADD SALARY IN TO OVERALL-TOTAL
    IF GENDER-IN = "M"
        ADD 1 TO MARRIED-MALE-COUNT
        ADD SALARY-IN TO MARRIED-MALE-TOTAL
        IF GENDER-IN "F"
            ADD 1 TO MARRIED-FEMALE-COUNT
            ADD SALARY-IN TO MARRIED-FEMALE-TOTAL
        END-IF.

请注意,我尚未针对GENDER-IN测试更正您的嵌套。

仅使用范围定界符结束任何条件会好得多。使用绝对最小的句号/句号。

PROCEDURE DIVISION.
any-paragraph-name-or-SECTION-name.
    some code 
    . 

那就是:PROCEDURE DIVISION头的结尾(如果有其中一项,则在USING上的项之后);在段落/节之前;段落/ SECTION标签的结尾;一段/节的结尾;程序结束。

那里有一些重叠,因为程序不需要其中包含段落/部分。

使您的IF的内容保持简单。避免重复代码。我在下面放了一个重新排列您的代码的示例。有两种样式,即用于Single的嵌套IF(因为此工作的目的可能是nested-IF)和用于已婚的另一种方式。

IF MARITAL-STATUS-IN = "S"
    PERFORM COUNT-ANY-PERSON
    PERFORM COUNT-SINGLE-PEOPLE
    IF GENDER-IN = "M"
        ADD 1 TO SINGLE-MALE-COUNT
        ADD SALARY-IN TO SINGLE-MALE-TOTAL
    END-IF
    IF GENDER-IN = "F"
        ADD 1 TO SINGLE-FEMALE-COUNT
        ADD SALARY-IN TO SINGLE-FEMALE-TOTAL
    END-IF
END-IF

IF MARITAL-STATUS-IN = "M"
    PERFORM COUNT-ANY-PERSON
    PERFORM COUNT-MARRIED-PEOPLE
END-IF
    .
COUNT-ANY-PERSON.
    ADD 1 TO OVERALL-COUNT
    ADD SALARY-IN TO OVERALL-TOTAL
    .
COUNT-SINGLE-PEOPLE.
    ADD 1 TO SINGLE-COUNT
    ADD SALARY-IN TO SINGLE-TOTAL
    .
COUNT-MARRIED-PEOPLE.
    ADD 1 TO MARRIED-COUNT
    ADD SALARY-IN TO MARRIED-TOTAL
    IF GENDER-IN = "M"
        ADD 1 TO MARRIED-MALE-COUNT
        ADD SALARY-IN TO MARRIED-MALE-TOTAL
    END-IF
    IF GENDER-IN = "F"
        ADD 1 TO MARRIED-FEMALE-COUNT
        ADD SALARY-IN TO MARRIED-FEMALE-TOTAL
    END-IF
    .

已婚/单身可能互斥。如果是这样,请使用ELSE而不是第二项测试。男性/女性可能是互斥的。如果是这样,请使用ELSE而不是第二项测试。如果它们不是互斥的,请找出您还需要计数的内容,而不是仅让数据通过程序。

您应该使用88级条件名称,而不要使用文字测试。使您的程序更易于理解和维护。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章