不止一次在COBOL中调用函数

时间:2013-04-25 16:15:32

标签: cobol gnucobol cobol85

我主要调用两个函数。 第二个函数叫做(Decrypt),调用它内部的第一个函数(Encrypt)。所以这里加密被调用两次。一旦进入主体,然后进入Decrypt。

问题在于它拒绝以这种方式工作。一旦在main中使用了Encrypt,我就无法在程序中的任何地方再次使用Encrypt。它就像变量仍在使用中,我无法传递新的变量。

例如,如果我从主函数中删除Encrypt并且只调用Decrypt - 它可以正常工作。我无法弄清楚原因。

IDENTIFICATION DIVISION.
PROGRAM-ID. CAESER-1-CIPHER.
DATA DIVISION.
PROCEDURE DIVISION
CALL 'ENCRYPT' USING BY CONTENT INPUTE CIPHERE.
CALL 'DECRYPT' USING BY CONTENT INPUTD CIPHERD.
STOP RUN.

IDENTIFICATION DIVISION.
PROGRAM-ID. ENCRYPT.
DATA DIVISION.
PROCEDURE DIVISION BLAH BLAH
BLAH BLAH COMPUTE
END PROGRAM ENCRYPT.

IDENTIFICATION DIVISION.
PROGRAM-ID. DECRYPT.
DATA DIVISION.
PROCEDURE DIVISION BLAH BLAH
CALL 'ENCRYPT' USING BY CONTENT BLAH BLAH
EXIT PROGRAM.
END PROGRAM DECRYPT.

3 个答案:

答案 0 :(得分:1)

我不确定我是否完全关注了您的问题,我会在DECRYPT中遇到更多问题。这就是为什么......

计划SER-1-CIPHER包含两个嵌套程序:ENCRYPTDECRYPT。直到你 声明ENCRYPTDECRYPT作为COMMON程序,他们无法“看到”彼此,因为只有程序 在更高的嵌套级别(例如SER-1-CIPHER)可以“看到”嵌套在它们中的程序。有关嵌套程序的Open Cobol程序员指南中对此进行了解释。

尝试将嵌套程序声明为:

 PROGRAM-ID. ENCRYPT IS COMMON.
 PROGRAM-ID. DECRYPT IS COMMON.

这样程序DECRYPT将能够CALL ENCRYPT。

接下来,我建议您在将控制权返回给操作系统时使用GOBACK代替STOP RUNEXIT PROGRAM或 调用程序。 OpenCobol程序员指南也提出了这个建议。

最后,每个子程序应包含GOBACK作为其最后一个语句。我不确定ENCRYPT的行为是什么 有某种明确的退货声明。你的实际程序可能有这个,但你问题中的代码示例没有。

Open Cobol似乎对嵌套程序之间的递归没有任何限制,但某些版本的COBOL做 不允许这样做(例如IBM Enterprise COBOL)。

答案 1 :(得分:1)

如果您的编译器支持它,请查看LOCAL-STORAGE SECTION。

每次调用子程序时,这将“自动”将所有值设置为初始状态。

它们是子程序,而不是函数。

NealB对IS INITIAL的建议将起作用。 LOCAL-STORAGE的优势在于你有一个“混合”的东西:你想要在CALL之间保留的值,你使用WORKING-STORAGE,以及你特别希望重置为初始状态的其他值,你在LOCAL-STORAGE中用VALUE子句定义。

IS INITIAL所做的处理相当于LOCAL-STORAGE的处理。每次程序名称被调用时,WORKING-STORAGE中具有VALUE子句的所有内容都将设置为该值。没有VALUE子句的字段具有“未定义”内容。

答案 2 :(得分:0)

加密功能中实例化的数据仍然存在。 他们需要重置。因此,加密中的任何数量的PIC都需要在函数开头设置为0,否则它们仍然会存储数据。

示例:

COMPUTE MYNUM1 = 0
COMPUTE MYNUM2 = 0
COMPUTE MYNUM3 = 0
MOVE '' TO MYVARSTRING