我在一个(但不是两个)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] 删除。
我来说两句